CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
Hello, I have this form (ns forclojure.core) (defn secondlast [coll counter] (let [ number 0 counter ( - (count coll)2)] (loop [coll counter] (if (== counter number) (first coll) (recur (next coll) (+ counter 1 )) But as soon as I try to send it to REPL I see this message: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2, compiling:(/home/roelof/clojure/forclojure/src/forclojure/core.clj:9:11) Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
`loop` expects a vector of binding forms (with initial values), not just a vector of names. (loop [coll counter]; means there is one `loop` binding named `coll`, with the initial value of `counter` To fix that problem directly: (loop [collcoll ; coll starts with an initial value of its value outside the loop counter counter] ; counter starts with an initial value of its value outside the loop ;; rest of code here ... Then you're left with an extra `let` (which was serving a similar purpose to `loop` initialization?), and the whole `loop` is possibly superfluous, because a function can be the target of a `recur`. On Tue, May 6, 2014 at 3:25 AM, Roelof Wobben rwob...@hotmail.com wrote: Hello, I have this form (ns forclojure.core) (defn secondlast [coll counter] (let [ number 0 counter ( - (count coll)2)] (loop [coll counter] (if (== counter number) (first coll) (recur (next coll) (+ counter 1 )) But as soon as I try to send it to REPL I see this message: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur, expected: 1 args, got: 2, compiling:(/home/roelof/clojure/forclojure/src/forclojure/core.clj:9:11) Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
Op dinsdag 6 mei 2014 10:43:40 UTC+2 schreef Benjamin R. Haskell: `loop` expects a vector of binding forms (with initial values), not just a vector of names. (loop [coll counter]; means there is one `loop` binding named `coll`, with the initial value of `counter` To fix that problem directly: (loop [collcoll ; coll starts with an initial value of its value outside the loop counter counter] ; counter starts with an initial value of its value outside the loop ;; rest of code here ... Then you're left with an extra `let` (which was serving a similar purpose to `loop` initialization?), and the whole `loop` is possibly superfluous, because a function can be the target of a `recur`. oke, so I could do (loop [ coll coll counter 0] instead of the let ? And what do you mean with superfluous ?? Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
I changed everything to this : (ns forclojure.core) (defn secondlast [coll] (let [number 0 ] (loop [coll coll counter (- (count coll)2)] (if (== counter number) (first coll) (recur (next coll) (+ number 1)) But now I get a loop which never ends. Roelof Op dinsdag 6 mei 2014 10:51:09 UTC+2 schreef Roelof Wobben: Op dinsdag 6 mei 2014 10:43:40 UTC+2 schreef Benjamin R. Haskell: `loop` expects a vector of binding forms (with initial values), not just a vector of names. (loop [coll counter]; means there is one `loop` binding named `coll`, with the initial value of `counter` To fix that problem directly: (loop [collcoll ; coll starts with an initial value of its value outside the loop counter counter] ; counter starts with an initial value of its value outside the loop ;; rest of code here ... Then you're left with an extra `let` (which was serving a similar purpose to `loop` initialization?), and the whole `loop` is possibly superfluous, because a function can be the target of a `recur`. oke, so I could do (loop [ coll coll counter 0] instead of the let ? And what do you mean with superfluous ?? Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
Well, == should be =, but more importantly you're mixing up number and counter. Step through your code one bit at a time: 1. You set number to 0 2. You set counter to (count coll) - 2 3. If number and counter are not equal... 4. Recur with the next part of the list, and set the counter to (+ number 1) See how you've got counter and number mixed up? - James On 6 May 2014 11:24, Roelof Wobben rwob...@hotmail.com wrote: I changed everything to this : (ns forclojure.core) (defn secondlast [coll] (let [number 0 ] (loop [coll coll counter (- (count coll)2)] (if (== counter number) (first coll) (recur (next coll) (+ number 1)) But now I get a loop which never ends. Roelof Op dinsdag 6 mei 2014 10:51:09 UTC+2 schreef Roelof Wobben: Op dinsdag 6 mei 2014 10:43:40 UTC+2 schreef Benjamin R. Haskell: `loop` expects a vector of binding forms (with initial values), not just a vector of names. (loop [coll counter]; means there is one `loop` binding named `coll`, with the initial value of `counter` To fix that problem directly: (loop [collcoll ; coll starts with an initial value of its value outside the loop counter counter] ; counter starts with an initial value of its value outside the loop ;; rest of code here ... Then you're left with an extra `let` (which was serving a similar purpose to `loop` initialization?), and the whole `loop` is possibly superfluous, because a function can be the target of a `recur`. oke, so I could do (loop [ coll coll counter 0] instead of the let ? And what do you mean with superfluous ?? Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
Op dinsdag 6 mei 2014 12:40:24 UTC+2 schreef James Reeves: Well, == should be =, but more importantly you're mixing up number and counter. Step through your code one bit at a time: 1. You set number to 0 2. You set counter to (count coll) - 2 3. If number and counter are not equal... 4. Recur with the next part of the list, and set the counter to (+ number 1) See how you've got counter and number mixed up? Yep, So I change it to this : (defn secondlast [coll] (let [number 0 ] (loop [coll coll counter (- (count coll)2)] (if (= counter number) (first coll) (recur (next coll) (+ number 1)) But when I do (secondlast (list 1 2 3 4 5)) I still do not get a answer, Roelof - James On 6 May 2014 11:24, Roelof Wobben rwo...@hotmail.com javascript:wrote: I changed everything to this : (ns forclojure.core) (defn secondlast [coll] (let [number 0 ] (loop [coll coll counter (- (count coll)2)] (if (== counter number) (first coll) (recur (next coll) (+ number 1)) But now I get a loop which never ends. Roelof Op dinsdag 6 mei 2014 10:51:09 UTC+2 schreef Roelof Wobben: Op dinsdag 6 mei 2014 10:43:40 UTC+2 schreef Benjamin R. Haskell: `loop` expects a vector of binding forms (with initial values), not just a vector of names. (loop [coll counter]; means there is one `loop` binding named `coll`, with the initial value of `counter` To fix that problem directly: (loop [collcoll ; coll starts with an initial value of its value outside the loop counter counter] ; counter starts with an initial value of its value outside the loop ;; rest of code here ... Then you're left with an extra `let` (which was serving a similar purpose to `loop` initialization?), and the whole `loop` is possibly superfluous, because a function can be the target of a `recur`. oke, so I could do (loop [ coll coll counter 0] instead of the let ? And what do you mean with superfluous ?? Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clo...@googlegroups.comjavascript: Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+u...@googlegroups.com javascript: For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com javascript:. For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
You've still got number and counter mixed up. Try going through the loop you've made and writing down their values: 1. coll (list 1 2 3 4 5), number 0, counter 3 2. coll (list 2 3 4 5), number 0, counter 1 3. coll (list 3 4 5), number 0, counter 2 4. coll (list 4 5), number 0, counter 3 5. coll (list 5), number 0, counter 4 6. coll nil, number 0, counter 5 7. coll nil, number 0, counter 6 ... And from there it keeps going. When writing software, you need to have an accurate mental model of the program you're writing. If your program isn't doing what you expect it to, then your mental model is broken. At that point you need to step through the code you've written and work out exactly what it does each step. - James On 6 May 2014 12:03, Roelof Wobben rwob...@hotmail.com wrote: Op dinsdag 6 mei 2014 12:40:24 UTC+2 schreef James Reeves: Well, == should be =, but more importantly you're mixing up number and counter. Step through your code one bit at a time: 1. You set number to 0 2. You set counter to (count coll) - 2 3. If number and counter are not equal... 4. Recur with the next part of the list, and set the counter to (+ number 1) See how you've got counter and number mixed up? Yep, So I change it to this : (defn secondlast [coll] (let [number 0 ] (loop [coll coll counter (- (count coll)2)] (if (= counter number) (first coll) (recur (next coll) (+ number 1)) But when I do (secondlast (list 1 2 3 4 5)) I still do not get a answer, Roelof - James On 6 May 2014 11:24, Roelof Wobben rwo...@hotmail.com wrote: I changed everything to this : (ns forclojure.core) (defn secondlast [coll] (let [number 0 ] (loop [coll coll counter (- (count coll)2)] (if (== counter number) (first coll) (recur (next coll) (+ number 1)) But now I get a loop which never ends. Roelof Op dinsdag 6 mei 2014 10:51:09 UTC+2 schreef Roelof Wobben: Op dinsdag 6 mei 2014 10:43:40 UTC+2 schreef Benjamin R. Haskell: `loop` expects a vector of binding forms (with initial values), not just a vector of names. (loop [coll counter]; means there is one `loop` binding named `coll`, with the initial value of `counter` To fix that problem directly: (loop [collcoll ; coll starts with an initial value of its value outside the loop counter counter] ; counter starts with an initial value of its value outside the loop ;; rest of code here ... Then you're left with an extra `let` (which was serving a similar purpose to `loop` initialization?), and the whole `loop` is possibly superfluous, because a function can be the target of a `recur`. oke, so I could do (loop [ coll coll counter 0] instead of the let ? And what do you mean with superfluous ?? Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clo...@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+u...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+u...@googlegroups.com. For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
As far as I understand recur is going back to the loop so number is never going back to 0 but I see the problem (-(count coll)2 is changing it value and that schould not happen. So I think I have to set the initial value of counter in the let. what schould happen is this collnumbercounter 1) [1,2,3.4.5) 0 3 2) [2.3,4,5]1 3 3) [3,4,5] 2 3 4) [ 4,5] 3 3 so the (first coll) is executed which is 4. Am I at the right track now. Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
Found the answer : (defn secondlast [coll] (let [number 0 counter (- (count coll)2) ] (loop [coll coll counter counter number number] (if (= counter number) (first coll) (recur (next coll) counter (+ number 1)) and without the loop there will be : (first(drop(reverse v)) Roelof Op dinsdag 6 mei 2014 13:36:53 UTC+2 schreef Roelof Wobben: As far as I understand recur is going back to the loop so number is never going back to 0 but I see the problem (-(count coll)2 is changing it value and that schould not happen. So I think I have to set the initial value of counter in the let. what schould happen is this collnumbercounter 1) [1,2,3.4.5) 0 3 2) [2.3,4,5]1 3 3) [3,4,5] 2 3 4) [ 4,5] 3 3 so the (first coll) is executed which is 4. Am I at the right track now. Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
Last + butlast? On Tuesday, May 6, 2014, Roelof Wobben rwob...@hotmail.com wrote: Found the answer : (defn secondlast [coll] (let [number 0 counter (- (count coll)2) ] (loop [coll coll counter counter number number] (if (= counter number) (first coll) (recur (next coll) counter (+ number 1)) and without the loop there will be : (first(drop(reverse v)) Roelof Op dinsdag 6 mei 2014 13:36:53 UTC+2 schreef Roelof Wobben: As far as I understand recur is going back to the loop so number is never going back to 0 but I see the problem (-(count coll)2 is changing it value and that schould not happen. So I think I have to set the initial value of counter in the let. what schould happen is this collnumbercounter 1) [1,2,3.4.5) 0 3 2) [2.3,4,5]1 3 3) [3,4,5] 2 3 4) [ 4,5] 3 3 so the (first coll) is executed which is 4. Am I at the right track now. Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.comjavascript:_e(%7B%7D,'cvml','clojure@googlegroups.com'); Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.comjavascript:_e(%7B%7D,'cvml','clojure%2bunsubscr...@googlegroups.com'); For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.comjavascript:_e(%7B%7D,'cvml','clojure%2bunsubscr...@googlegroups.com'); . For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
Yes, except there's no need to pass counter into the loop if it doesn't change. (And naming a constant value counter is a little weird). - James On 6 May 2014 13:07, Roelof Wobben rwob...@hotmail.com wrote: Found the answer : (defn secondlast [coll] (let [number 0 counter (- (count coll)2) ] (loop [coll coll counter counter number number] (if (= counter number) (first coll) (recur (next coll) counter (+ number 1)) and without the loop there will be : (first(drop(reverse v)) Roelof Op dinsdag 6 mei 2014 13:36:53 UTC+2 schreef Roelof Wobben: As far as I understand recur is going back to the loop so number is never going back to 0 but I see the problem (-(count coll)2 is changing it value and that schould not happen. So I think I have to set the initial value of counter in the let. what schould happen is this collnumbercounter 1) [1,2,3.4.5) 0 3 2) [2.3,4,5]1 3 3) [3,4,5] 2 3 4) [ 4,5] 3 3 so the (first coll) is executed which is 4. Am I at the right track now. Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.
Re: CompilerException java.lang.IllegalArgumentException: Mismatched argument count to recur
On 6 May 2014 13:09, Gary Trakhman gary.trakh...@gmail.com wrote: Last + butlast? Yeah, there are a few more concise solutions to this problem if you're familiar with the standard library: (last (butlast coll)) (second (reverse coll)) (peek (pop (vec coll))) And a more efficient loop-solution would just keep the previous value stored until the end of the loop is reached: (loop [prev nil, coll (seq coll)] (if (next coll) (recur (first coll) (next coll) prev)) - James On Tuesday, May 6, 2014, Roelof Wobben rwob...@hotmail.com wrote: Found the answer : (defn secondlast [coll] (let [number 0 counter (- (count coll)2) ] (loop [coll coll counter counter number number] (if (= counter number) (first coll) (recur (next coll) counter (+ number 1)) and without the loop there will be : (first(drop(reverse v)) Roelof Op dinsdag 6 mei 2014 13:36:53 UTC+2 schreef Roelof Wobben: As far as I understand recur is going back to the loop so number is never going back to 0 but I see the problem (-(count coll)2 is changing it value and that schould not happen. So I think I have to set the initial value of counter in the let. what schould happen is this collnumbercounter 1) [1,2,3.4.5) 0 3 2) [2.3,4,5]1 3 3) [3,4,5] 2 3 4) [ 4,5] 3 3 so the (first coll) is executed which is 4. Am I at the right track now. Roelof -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout. -- You received this message because you are subscribed to the Google Groups Clojure group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups Clojure group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.