code-reviews

roelofw 2016-12-12T13:58:13.000271Z

someone who can give me a hint. I tried (not ( and (not(every? true? args)) (not-any? true? args))

roelofw 2016-12-12T13:59:05.000272Z

that one is good when doing all the test except [true, true, true] which gives now true but it has to be false

roelofw 2016-12-12T13:59:38.000273Z

@gdeer81 @gowder

gdeer81 2016-12-12T15:45:27.000275Z

@roelofw you're on the right track but you've made a mess of your logic so lets try to think of this problem in simpler terms

roelofw 2016-12-12T15:46:20.000276Z

I know im on the right track because most of the tests are a success

roelofw 2016-12-12T15:46:54.000277Z

I still have difficult to find out which function I need to use

roelofw 2016-12-12T15:47:04.000278Z

@gdeer81

gdeer81 2016-12-12T15:48:29.000279Z

I'm trying to figure out a good way of talking you through it without giving away the answer

roelofw 2016-12-12T15:48:39.000280Z

oke

roelofw 2016-12-12T15:49:07.000281Z

I making dinner right now so It can be that i do not respond quick

gdeer81 2016-12-12T15:49:25.000282Z

so what function would you use if the requirement was to return true if they were all true or all false?

roelofw 2016-12-12T15:51:19.000283Z

every? Returns true if (pred x) is logical true for every x in coll, else false.

gdeer81 2016-12-12T15:52:53.000284Z

so you would write (or (every? true? args) (every? false? args)) ?

gdeer81 2016-12-12T15:53:41.000285Z

but there is a function that already checks for equality

gdeer81 2016-12-12T15:53:44.000286Z

=

roelofw 2016-12-12T15:53:50.000287Z

yes, I forget that all of then could be false

roelofw 2016-12-12T15:54:36.000288Z

yep , 1 = 2 gives false

roelofw 2016-12-12T15:54:50.000289Z

and 2 = 2 gives true

roelofw 2016-12-12T15:55:13.000290Z

so far im with you

gdeer81 2016-12-12T15:57:15.000291Z

and you're getting a bunch of booleans so it's even easier because you don't really need a predicate function

roelofw 2016-12-12T15:59:05.000292Z

oke, you you mean something like a map to compare the item with true or false ?

roelofw 2016-12-12T16:00:07.000293Z

I was thinking about something like this (and (some true? args) (some? false args))

gdeer81 2016-12-12T16:00:18.000294Z

that sounds like you would need a predicate function which I just hinted you don't need

roelofw 2016-12-12T16:01:22.000295Z

hmm, I have to do some comparison otherwise I do not know if something is true or false

roelofw 2016-12-12T16:02:03.000296Z

so I cannot think of a solution without any predicate

roelofw 2016-12-12T16:04:00.000297Z

im sorry

roelofw 2016-12-12T16:07:45.000298Z

@gdeer81 I cannot think of a solution that you have in mind

roelofw 2016-12-12T16:09:56.000299Z

can you give a hint how I can check this [ true, true, true] is all true without a predicate

roelofw 2016-12-12T16:10:20.000300Z

in my opinion = is also a predicate

roelofw 2016-12-12T16:11:11.000301Z

or do you mean something like this (map (= true) args)

gdeer81 2016-12-12T16:23:57.000302Z

you don't need to map = since it takes a variable number of arguments

gdeer81 2016-12-12T16:26:21.000303Z

okay I think I'm just making things confusing, lets go back to the thing you put earlier, (and (some true? args) (some false? args))

roelofw 2016-12-12T16:26:32.000304Z

oke

gdeer81 2016-12-12T16:26:42.000305Z

which cases did that fail on?

roelofw 2016-12-12T16:26:56.000306Z

moment, I have to try, this is new idea

roelofw 2016-12-12T16:27:57.000307Z

it fails here :

FAIL in (test1) (1_half_truth_test.clj:7)
Half truth - test 1
expected: (= (half-truth true true true true) false)
  actual: (not (= nil false)) 

gdeer81 2016-12-12T16:28:54.000308Z

did your function return nil?

roelofw 2016-12-12T16:29:29.000309Z

yes, apperently , which is not so wierd.

Returns the first logical true value of (pred x) for any x in coll,
else nil.  One common idiom is to use a set as pred, for example
this will return :fred if :fred is in the sequence, otherwise nil:
(some #{:fred} coll)  

roelofw 2016-12-12T16:29:54.000310Z

so some? i returning nill if a item is not found

gdeer81 2016-12-12T16:31:32.000311Z

what did you put?

gdeer81 2016-12-12T16:33:52.000312Z

it was probably because of your and statement, since one of your statements returns nil your and statement returned nil

roelofw 2016-12-12T16:34:34.000313Z

the code we are talking about

(defn half-truth 
  "Solution to Problem 1: 
   Write a function which takes a variable number of booleans. 
   Your function should return true if some of the parameters
   are true, but not all of the parameters are true. 
   Otherwise your function should return false."
  [& args]
  (and (some true? args) (some false? args)))  

roelofw 2016-12-12T16:35:05.000314Z

maybe a idea to check if the output is true or false ?

roelofw 2016-12-12T16:36:26.000315Z

he, with this one all tests of the stanford are green :

(defn half-truth 
  "Solution to Problem 1: 
   Write a function which takes a variable number of booleans. 
   Your function should return true if some of the parameters
   are true, but not all of the parameters are true. 
   Otherwise your function should return false."
  [& args]
  ( true? (and (some true? args) (some false? args))))  

roelofw 2016-12-12T16:40:05.000316Z

chips, but now working here well :

(half-truth [false true false ])
=> false 

roelofw 2016-12-12T16:40:26.000317Z

if I read the desription that one schould be true

roelofw 2016-12-12T16:40:56.000318Z

nope, the answer always is false

roelofw 2016-12-12T16:43:08.000319Z

it seems that there cannot be a solution that works for all cases

agile_geek 2016-12-12T16:47:59.000320Z

@roelofw look at what you are passing as an argument in that call to half-truth and what the defn is taking as an argument

agile_geek 2016-12-12T16:48:21.000321Z

There's nothing wrong with the code in the body of the defn

roelofw 2016-12-12T16:51:26.000322Z

chips, the arguments are all seperate

gdeer81 2016-12-12T16:52:58.000323Z

yeah, its good to copy/paste the test cases from the problem so you don't make a typo and craft a solution for a totally different problem

roelofw 2016-12-12T16:53:05.000324Z

this looks well to me :

(half-truth true true true )
=> false
(half-truth true true false )
=> true
(half-truth false true false )
=> true
(half-truth false false false )
=> false
 

roelofw 2016-12-12T16:53:37.000325Z

so 2 out of the 4 challenges solved of the standford ones

agile_geek 2016-12-12T16:54:48.000326Z

@roelofw do you know why false false false or true true true was returning nil until you added the true? predicate around the and

agile_geek 2016-12-12T16:54:50.000327Z

?

agile_geek 2016-12-12T16:55:15.000328Z

Read the docs for some and see if you can work out why

roelofw 2016-12-12T16:57:43.000329Z

@agile_geek yes, see here of the docs of some? Returns the first logical true value of (pred x) for any x in coll,else nil

agile_geek 2016-12-12T16:57:53.000330Z

👍

roelofw 2016-12-12T16:59:03.000332Z

so if there is nothing that is true when I do (some? true? [false, false, false]) then the answer will be nill

agile_geek 2016-12-12T16:59:38.000333Z

Yes and same if nothing false in the other branch of the and

gdeer81 2016-12-12T17:00:51.000334Z

@roelofw did you get a working solution yet? can I tell you the answer now?

agile_geek 2016-12-12T17:01:26.000335Z

And because and stops once it's evaluated all the predicates (if they're all truthy) or on the first that is falsey and returns the value from the some clause that's falsey you get nil

roelofw 2016-12-12T17:08:20.000336Z

yep

roelofw 2016-12-12T17:08:54.000337Z

@gdeer81 I have this as working solution :

(defn half-truth 
  "Solution to Problem 1: 
   Write a function which takes a variable number of booleans. 
   Your function should return true if some of the parameters
   are true, but not all of the parameters are true. 
   Otherwise your function should return false."
  [& args]
  ( true? (and (some true? args) (some false? args))))  

gdeer81 2016-12-12T17:09:45.000338Z

okay, good now I won't feel bad if I accidentally give away the answer I had in mind

roelofw 2016-12-12T17:10:14.000339Z

@gdeer81 is it a totally other answer then

roelofw 2016-12-12T17:10:52.000340Z

I get this idea when you wrote : (or (every? true? args) (every? false? args))

gdeer81 2016-12-12T17:11:12.000341Z

hint 1: this problem can be solved with one function that is in core

roelofw 2016-12-12T17:12:03.000343Z

yes, and somebody else said it could be done in 4 characters

roelofw 2016-12-12T17:12:35.000344Z

but there are not much functions with 4 characters 🙂

gdeer81 2016-12-12T17:12:53.000345Z

well then that should narrow it down

gdeer81 2016-12-12T17:13:24.000346Z

write a function that returns all the functions in core that have exactly 4 characters

roelofw 2016-12-12T17:14:06.000347Z

that is a difficult one

roelofw 2016-12-12T17:15:35.000348Z

oke, with google I succeed

roelofw 2016-12-12T17:16:01.000349Z

I can display al functions of core with (dir clojure.core)

gdeer81 2016-12-12T17:19:09.000350Z

there are 72

roelofw 2016-12-12T17:21:18.000351Z

hmm, filter does not what I expect : (filter (fn[item] (= (count item) 4 )) (dir clojure.core))

gdeer81 2016-12-12T17:25:36.000352Z

just use this as a reference https://gist.github.com/gdeer81/3897e926a7dea79dd070607bcdb5a548

gdeer81 2016-12-12T17:27:12.000353Z

although this probably isn't helping you think about the problem in simpler terms

roelofw 2016-12-12T17:27:14.000354Z

oke, and now I have to read a lot of pages

roelofw 2016-12-12T17:29:36.000355Z

no, I see some candidates but no function who looks right

roelofw 2016-12-12T17:30:32.000356Z

most promising looks not= but if I read the page I do not think its the one

roelofw 2016-12-12T17:30:48.000357Z

some I tried and it is not the answer

gdeer81 2016-12-12T17:33:22.000358Z

what does the page for not= say?

roelofw 2016-12-12T17:33:46.000359Z

Same as (not (= obj1 obj2))

roelofw 2016-12-12T17:34:49.000360Z

hmm, maybe the args could be obj1 and something like [ true , true] as obj2 ?

roelofw 2016-12-12T17:35:45.000361Z

or maybe something like this one (not= true true true true)

gdeer81 2016-12-12T17:36:58.000362Z

since it is referring to = in the doc string you'd have to read the docs for = to understand how it is supposed to work

roelofw 2016-12-12T17:37:39.000363Z

I look at the examples and these look very good :

(not= false false false )
=> false
(not= true false false )
=> true
(not= true true true )
=> false  

roelofw 2016-12-12T17:38:15.000364Z

(not= true false true )
=> true  

roelofw 2016-12-12T17:38:44.000365Z

so it will be (not= args)

roelofw 2016-12-12T17:38:54.000366Z

a very short one

gdeer81 2016-12-12T17:40:41.000367Z

or you could just pass in the function itself without having to wrap it since #(not= %&) is the same as just passing in that function itself

roelofw 2016-12-12T17:42:13.000368Z

nope, this case is failing :

FAIL in (test2) (1_half_truth_test.clj:11)
Half truth - test 2
expected: (= (half-truth true false true) true)
  actual: (not (= false true))
 

roelofw 2016-12-12T17:42:27.000369Z

it gives false

roelofw 2016-12-12T17:43:13.000370Z

and because there a two true and one false , t schould give true

snoe 2016-12-12T17:43:24.000371Z

replace args with the value and you'll see why

snoe 2016-12-12T17:43:55.000372Z

or, what is args?

roelofw 2016-12-12T17:44:27.000373Z

args is a vector so here [false false]

snoe 2016-12-12T17:44:59.000374Z

so when you do (not= args) you are doing (not= [false false])

gdeer81 2016-12-12T17:45:22.000375Z

so I retract my statement above

roelofw 2016-12-12T17:45:37.000377Z

chips , & args gives a vector and not the input itself 😞

gdeer81 2016-12-12T17:45:54.000378Z

#(not= %&) is not the same as bare not=

snoe 2016-12-12T17:46:35.000379Z

take a look at apply @roelofw

roelofw 2016-12-12T17:47:16.000380Z

@gdeer81 this is also not working :

(defn half-truth 
  "Solution to Problem 1: 
   Write a function which takes a variable number of booleans. 
   Your function should return true if some of the parameters
   are true, but not all of the parameters are true. 
   Otherwise your function should return false."
  [& args]
  #(not= %&))  

roelofw 2016-12-12T17:47:42.000381Z

it fails with this :

FAIL in (test1) (1_half_truth_test.clj:7)
Half truth - test 1
expected: (= (half-truth true true true true) false)
  actual: (not (= #object[pset1.1_half_truth$half_truth$fn__205 0x1133976 "pset1.1_half_truth$half_truth$fn__205@1133976"] false))  

agile_geek 2016-12-12T17:48:56.000382Z

@roelofw args is being coerced into a sequence in you argument vector in the defn of half-truth

roelofw 2016-12-12T17:49:23.000383Z

yes, That is what I said earlier, @agile_geek

gdeer81 2016-12-12T17:49:36.000384Z

@roelofw you've gone over your four character limit

roelofw 2016-12-12T17:49:46.000385Z

yep

agile_geek 2016-12-12T17:49:47.000386Z

but you are calling half-truth with a variable number of arguments and not= takes a variable number of arguments so you don't need to coerce args to a sequence

gdeer81 2016-12-12T17:50:07.000387Z

you don't need to define a new function, just pass in not=

gdeer81 2016-12-12T17:50:52.000388Z

however, if you do want to wrap it in your own function you will have to unroll the args

roelofw 2016-12-12T17:50:55.000389Z

@agile_geek so I can change [& args] to [ args]

agile_geek 2016-12-12T17:51:17.000390Z

not if you want it in separate fn

agile_geek 2016-12-12T17:51:25.000391Z

as @gdeer81 said

agile_geek 2016-12-12T17:51:43.000392Z

just use not= or use apply to unroll args

roelofw 2016-12-12T17:52:28.000393Z

so somehing like (not= (apply args)) ????

agile_geek 2016-12-12T17:52:53.000394Z

if you keep your fn and change argument to [arg] it will only expect one arg

agile_geek 2016-12-12T17:53:00.000395Z

No

gdeer81 2016-12-12T17:53:01.000396Z

@roelofw what does the doc string for apply say?

agile_geek 2016-12-12T17:53:09.000397Z

☝️

roelofw 2016-12-12T17:53:20.000398Z

'(apply function args) `

roelofw 2016-12-12T17:53:51.000399Z

so (apply (not= ) args)

gdeer81 2016-12-12T17:54:00.000400Z

close

agile_geek 2016-12-12T17:54:26.000401Z

it's the function you're applying not the evaluated function

agile_geek 2016-12-12T17:55:10.000402Z

remember putting a fn in parens makes Clojure evaluate it

roelofw 2016-12-12T17:56:40.000404Z

the function is (not= args) , Right ?

agile_geek 2016-12-12T17:56:50.000405Z

thats the evaluated function

agile_geek 2016-12-12T17:57:03.000406Z

i.e you are calling the fn not=

agile_geek 2016-12-12T17:57:14.000407Z

with the argument args

roelofw 2016-12-12T17:57:50.000408Z

oke, so it would be (apply (not=) args)

gdeer81 2016-12-12T17:58:04.000409Z

that will give you an arity exception

roelofw 2016-12-12T17:58:10.000410Z

yes, I does

agile_geek 2016-12-12T17:58:15.000411Z

That's still evaluating not= but with no args

roelofw 2016-12-12T17:59:03.000412Z

I will take a break, my head is spinning

agile_geek 2016-12-12T17:59:41.000413Z

So what happens if Clojure evaluates this (not=) which gives an arity exception, and then tries to pass the result to (apply <result of calling not=> args)

roelofw 2016-12-12T17:59:47.000414Z

apply wants a function and some arguments and I cannot see what the function is and what the arguments

agile_geek 2016-12-12T18:00:00.000415Z

What is the name of the function

roelofw 2016-12-12T18:00:11.000416Z

not=

gdeer81 2016-12-12T18:00:14.000417Z

consider this example (+ [1 2 3])

gdeer81 2016-12-12T18:00:32.000419Z

how could you use apply to make + work with this vector?

roelofw 2016-12-12T18:00:44.000420Z

there + is the function and [1 2 3 ] as a arguments I think

agile_geek 2016-12-12T18:00:49.000421Z

right

roelofw 2016-12-12T18:01:14.000422Z

so (apply (+) [ 1 2 3 ] )

agile_geek 2016-12-12T18:01:43.000423Z

What is the reuslt of (+) on its own

snoe 2016-12-12T18:01:44.000424Z

what does (+) evaluate to?

roelofw 2016-12-12T18:01:59.000425Z

but schould this not be in #beginner or #clojure ?

roelofw 2016-12-12T18:02:19.000426Z

a function ??

snoe 2016-12-12T18:02:26.000427Z

(fn? (+))

snoe 2016-12-12T18:02:35.000428Z

vs (fn? +)

gdeer81 2016-12-12T18:03:07.000431Z

heading to lunch now, keep at it, you're almost there

roelofw 2016-12-12T18:03:27.000432Z

I do not have that feeling

agile_geek 2016-12-12T18:03:30.000433Z

so if (+) evaluates to 0

roelofw 2016-12-12T18:03:42.000434Z

yes, I saw it on your code

agile_geek 2016-12-12T18:03:45.000435Z

then this (apply (+) [1 2 3])

agile_geek 2016-12-12T18:04:09.000437Z

is same as (apply 0 [1 2 3])

roelofw 2016-12-12T18:04:39.000438Z

I think this will be (+ 1 2 3) at the end

roelofw 2016-12-12T18:05:17.000440Z

so something is still not right

roelofw 2016-12-12T18:05:25.000441Z

the + has to stay

snoe 2016-12-12T18:05:29.000443Z

no, it will be (0 1 2 3) apply only sees the substituted value

roelofw 2016-12-12T18:06:13.000444Z

apply is not easy to understand

agile_geek 2016-12-12T18:06:53.000445Z

It is when you get the hang of it. At the moment you are passing it the result of evaluating a function, not the function itself

snoe 2016-12-12T18:07:32.000446Z

yeah but understanding apply is fundamental to lisp, understand it and other things will make sense too

agile_geek 2016-12-12T18:07:58.000447Z

i.e. in the + example you were evaluating + (+) which is 0 and then passing that to apply but 0 is not a function

agile_geek 2016-12-12T18:08:30.000448Z

hence the class cast exception in Clojurebot ☝️

roelofw 2016-12-12T18:08:51.000449Z

what I want is something like this (fn [ acc item] ( acc + item)) Like I will do when using a map or reduce

snoe 2016-12-12T18:09:14.000450Z

@roelofw do you know other languages?

agile_geek 2016-12-12T18:09:18.000451Z

You could use reduce but apply is easier

roelofw 2016-12-12T18:09:23.000452Z

a little bit ruby

roelofw 2016-12-12T18:10:05.000453Z

@agile_geek that part I understand now

roelofw 2016-12-12T18:10:32.000454Z

but I do not see how I can make it work with apply at this moment, sorry

snoe 2016-12-12T18:10:40.000455Z

apply is like the splat operator not_equal(*args)

agile_geek 2016-12-12T18:11:05.000456Z

So you need to pass apply the unevaluated +

agile_geek 2016-12-12T18:11:42.000457Z

As you evaluate + using parens (+), how would you pass + not evaluated?

roelofw 2016-12-12T18:12:15.000460Z

oke, so without the ()

agile_geek 2016-12-12T18:12:22.000461Z

Yep

roelofw 2016-12-12T18:12:53.000462Z

so it would be `(apply + [1 2 3])

roelofw 2016-12-12T18:13:31.000465Z

oke, so back to our code

agile_geek 2016-12-12T18:13:36.000466Z

So in your half-truth example you can use apply with not=

roelofw 2016-12-12T18:13:48.000467Z

(apply not= args) ?

agile_geek 2016-12-12T18:14:35.000468Z

Try it

agile_geek 2016-12-12T18:14:57.000469Z

what does (apply not= [true true false]) give you

roelofw 2016-12-12T18:15:14.000470Z

all test provided by the standford challenges are green

agile_geek 2016-12-12T18:17:19.000474Z

So now you know a way of calling a function that takes separate multiple arguments when you have a collection of arguments

roelofw 2016-12-12T18:17:39.000475Z

yes, I learned a lot today from you and some others

roelofw 2016-12-12T18:17:55.000476Z

now time for the dishes 😞

roelofw 2016-12-12T18:18:39.000477Z

and tomorrow try to find out how to find the nth row of a pascal triangle

roelofw 2016-12-12T18:19:25.000478Z

but I noticed how more you know of clojure how shorter the code it seems

roelofw 2016-12-12T18:19:39.000479Z

All thanks and have a good day/evening

gdeer81 2016-12-12T18:35:16.000480Z

@roelofw I was going to ask you to now try and solve it with set theory

😄 1
roelofw 2016-12-12T18:46:40.000482Z

the same exercise with a set

roelofw 2016-12-12T18:46:48.000483Z

?

roelofw 2016-12-12T18:46:55.000484Z

@gdeer81

gdeer81 2016-12-12T18:47:30.000485Z

yeah your function rolls up the arguments into a collection, so what happens if you called (set args) ?

roelofw 2016-12-12T18:48:07.000486Z

( count (set(args) > 1) out if my head

gdeer81 2016-12-12T18:48:16.000487Z

exactly right

roelofw 2016-12-12T18:48:44.000488Z

so if there are more then 1 arg then there is one or more true or false

roelofw 2016-12-12T18:49:31.000490Z

if there is only 1 the seq contains only true or false

gdeer81 2016-12-12T18:49:32.000491Z

okay, I updated my statement

roelofw 2016-12-12T18:55:56.000499Z

@gdeer81 happy with the solution

gdeer81 2016-12-12T18:56:48.000500Z

the readability could be improved. how many items does the set have every time its suppose to return true?

roelofw 2016-12-12T18:57:13.000501Z

more then1

gdeer81 2016-12-12T18:57:41.000502Z

but it will never have 3

roelofw 2016-12-12T18:58:05.000504Z

nope,, its 1 or 2

roelofw 2016-12-12T18:58:29.000505Z

1 if the items are all true or false, 2 if both

gdeer81 2016-12-12T18:58:59.000506Z

so what is more readable (= 2 (count (set args))) or (> (count (set args)) 1) ?

roelofw 2016-12-12T18:59:22.000507Z

I think the first

snoe 2016-12-12T19:00:21.000508Z

ofc things look a bit different with 0 or 1 args

gdeer81 2016-12-12T19:01:19.000509Z

well this is assuming that this is being called with (defn [& args] ...) so the args are always being rolled up

roelofw 2016-12-12T19:01:46.000510Z

I have asummed the same

roelofw 2016-12-12T19:01:59.000511Z

So I have earned a C today 🙂

gdeer81 2016-12-12T19:02:49.000512Z

the point is that you've come away from this experience knowing more than you knew when you came in

roelofw 2016-12-12T19:03:06.000513Z

yep, today I did

gdeer81 2016-12-12T19:03:15.000514Z

then today you get an A

✅ 2
roelofw 2016-12-12T19:03:45.000515Z

learned to read stack traces and where the error can be found

roelofw 2016-12-12T19:03:53.000516Z

learned apply

roelofw 2016-12-12T19:04:31.000518Z

learned not=

roelofw 2016-12-12T19:05:05.000519Z

I hope I can use it later on when needed

gdeer81 2016-12-12T19:05:29.000520Z

and you've learned when Clojure "rolls up" arguments and what that means

roelofw 2016-12-12T19:05:44.000521Z

that will be the biggest challenge on the standford and 4clojure challenges

gdeer81 2016-12-12T19:06:25.000522Z

You've also learned the difference between a function and a function evaluation

roelofw 2016-12-12T19:06:57.000523Z

that is why my head is spinning

roelofw 2016-12-12T19:07:02.000524Z

😛

roelofw 2016-12-12T19:07:47.000525Z

learned how to refractor functions so I can test them

gdeer81 2016-12-12T19:07:48.000526Z

I think it's confusing because as a beginner you're taught to always hug your functions

roelofw 2016-12-12T19:08:01.000527Z

hug my functions ??

gdeer81 2016-12-12T19:08:40.000528Z

so (apply + [1 2 3]) looks weird because you want to hug that plus sign (+)

roelofw 2016-12-12T19:09:07.000529Z

oke

gdeer81 2016-12-12T19:09:35.000530Z

this is what tripped me up when I started learning the -> macro

roelofw 2016-12-12T19:10:27.000531Z

oke, I use the ->> on my first attempt for a website but there I had not make this mistake

gdeer81 2016-12-12T19:11:11.000532Z

this was quite a thorough code review

roelofw 2016-12-12T19:13:21.000533Z

yep

roelofw 2016-12-12T19:13:57.000534Z

with a lot of explanation , I wonder if some of this schould not be in beginners or the clojure channel

roelofw 2016-12-12T19:16:45.000535Z

Now with 4clojure I have to reimplement zipmap and with the stanford challenges I have to find the nth row of a pascal triangle

roelofw 2016-12-12T19:16:55.000536Z

both not easy

roelofw 2016-12-12T19:17:18.000537Z

but now time for family

roelofw 2016-12-12T20:19:12.000538Z

@gdeer81 if you want and have time , do you want to review the last version of my paintings website : https://github.com/rwobben/paintings

gdeer81 2016-12-12T20:36:33.000540Z

yeah I'll take a look and see if I notice any glaring issues

roelofw 2016-12-12T21:45:46.000541Z

thanks, do it only if you have time