[plt-scheme] Question about map

From: Marco Morazan (morazanm at gmail.com)
Date: Thu Jul 3 16:56:25 EDT 2008

How so?

On Thu, Jul 3, 2008 at 4:45 PM, Felix Klock's PLT scheme proxy
<pltscheme at pnkfx.org> wrote:
> I think you are misusing letrec.
>
> Try a let* instead.
>
> -Felix
>
> On Jul 3, 2008, at 4:38 PM, Marco Morazan wrote:
>
>> Hi All,
>>
>> I am a bit baffled. I have reproduced below a simplified example of my
>> rather large piece of software that produces the same error.
>>
>> (define F '(define (f x) (+ x x)))
>>
>> (define (all-but-last datum)
>>  (if (null? (cdr datum))
>>     '()
>>     (cons (car datum) (all-but-last (cdr datum)))))
>>
>> (define (parse-test datum)
>>  (letrec ((fname (caadr datum))
>>          (params (cdadr datum))
>>          (localdefs (all-but-last (cddr datum)))
>>          (localdefs-names (map caadr localdefs)))
>>   'ok))
>>
>> With the above I get:
>>
>> Welcome to DrScheme, version 4.0.1tsrj2008-1 [3m].
>> Language: Essentials of Programming Languages (2nd ed.); memory limit:
>> 128 megabytes.
>>>
>>> (all-but-last (cddr F))
>>
>> ()
>>>
>>> (map caadr (all-but-last (cddr F)))
>>
>> ()
>>>
>>> (parse-test F)
>>
>> . . mcar: expects argument of type <mutable-pair>; given #<undefined>
>>>
>>
>> As far as I can tell, (map caadr (all-but-last (cddr F))) and
>> (parse-test F) should yield the same result and (parse-test F) should
>> yield 'ok.
>>
>> Now, here are the results with v372:
>>
>> Welcome to DrScheme, version 372 [3m].
>> Language: Essentials of Programming Languages (2nd ed.).
>>>
>>> (all-but-last (cddr F))
>>
>> ()
>>>
>>> (map caadr (all-but-last (cddr F)))
>>
>> ()
>>>
>>> (parse-test F)
>>
>> ok
>>>
>>
>> I think Eli is onto something. When I display the value of localdefs
>> in v4.0.1 it is #<undefined> while in v372 it is ().
>>
>> I really hope I am missing something trivial and that I will have one
>> of those DUH! moments soon. In the meantime, I am really baffled.
>>
>> Once again, any pointers would be appreciated.
>>
>> Cheers,
>>
>> Marco
>>
>>
>> On Thu, Jul 3, 2008 at 3:45 PM, Eli Barzilay <eli at barzilay.org> wrote:
>>>
>>> On Jul  3, Robby Findler wrote:
>>>>
>>>> AFAICT, EoPL works fine with the basic example you're giving. I'm
>>>> still not able to divine what is going wrong:
>>>>
>>>> Welcome to DrScheme, version 4.0.1.3-svn2jul2008 [3m].
>>>> Language: Essentials of Programming Languages (2nd ed.); memory limit:
>>>> 128 megabytes.
>>>>>
>>>>> (map caadr (list '(lambda (x) x)))
>>>>
>>>> (x)
>>>
>>> My guess is that there are two problems here: the first is that `map'
>>> is bound to `mmap', and `caadr' is bound to a function that composes
>>> `mcar' and `mcdr' -- and these make error messages confusing Marco
>>> here:
>>>
>>>>>>> My code does not use mcar anywhere. I must assume it has to do
>>>>>>> with the implementation of map (?).
>>>
>>>
>>>
>>> But the real problem is elsewhere:
>>>
>>>>>>> This code: (map caadr localdefs)
>>>>>>>
>>>>>>> Produces this error:
>>>>>>>
>>>>>>> mcar: expects argument of type <mutable-pair>; given
>>>>>>> #<undefined>
>>>
>>> You must have some `undefined' value somewhere, and that's probably
>>> due something that changed in the language.  (And because of the above
>>> the error message doesn't help.)
>>>
>>> To find the bad value I'd start with
>>>
>>> (map (lambda (x)
>>>       (if (and (pair? x) (pair? (cdr x)) (pair? (cadr x)))
>>>         (caadr x)
>>>         (error 'blah "~s" x)))
>>>     localdefs)
>>>
>>> and go on from there.
>>>
>>> --
>>>        ((lambda (x) (x x)) (lambda (x) (x x)))          Eli Barzilay:
>>>                http://www.barzilay.org/                 Maze is Life!
>>>
>> _________________________________________________
>>  For list-related administrative tasks:
>>  http://list.cs.brown.edu/mailman/listinfo/plt-scheme
>
>


Posted on the users mailing list.