On Fri, Dec 3, 2010 at 12:33, David Steiner <[email protected]> wrote:
> i'm reading SICP and practicing in chicken. in the book they redefine
> cons, car and cdr using procedures:
>
> (define (cons x y)
>  (define (dispatch m)
>    (cond ((= m 0) x)
>          ((= m 1) y)
>          (else (error "Argument not 0 or 1 -- CONS" m))))
>  dispatch)
> (define (car z) (z 0))
> (define (cdr z) (z 1))
>
> however it produces an error in chicken:
>   Error: (caar) bad argument type: #<procedure (dispatch m)>
>
> why doesn't it work?

I'm no expert on Chicken's internals (entrails?), but it seems to me
that the problem here is, that you're overwriting the global 'cons'
function, which is probably used by other Chicken functions and
macros. Once you do this, all bets are off: I notice that after
defining just the new 'cons', defining *any* new function produces
this error.

As you already found out, the solution is to use different names that
don't clash with important toplevel functions.

(Out of curiosity, I tried this in Gauche and Gambit, and they seem to
have no problems with it, at first sight. It's just a matter of how
things are implemented in a Scheme system.)

-- 
Hans Nowak

_______________________________________________
Chicken-users mailing list
[email protected]
http://lists.nongnu.org/mailman/listinfo/chicken-users

Reply via email to