[MSLUG] Concerns about the behavior of call/cc

Benoit Fraikin benoit.fraikin at usherbrooke.ca
Wed Apr 30 00:42:36 EDT 2008


Greetings,

I have a few questions about call/cc
I work on mzscheme v.360

When I try to execute

( (call/cc (lambda (exit)
              (apply (call/cc (lambda (k)(exit k))) '(1 2 3))
              )
            )
   2 )

I get this error

   apply: expects type <procedure> as 1st argument, given: 2; other  
arguments were: (1 2 3)

It seems normal to me. If I clearly understand the behavior of call/ 
cc, the execution is as follow

to try to execute E = ( (call/cc ... ) 2 )
1-  try to execute the (call/cc ... )
2- this means: try to execute (apply (call/cc (lambda (k)(exit k)))  
'(1 2 3))
    where exit is the continuation -> (lambda (v) (v 2))
2.1- try to execute   (call/cc (lambda (k)(exit k))))
2.2- this means: try to execute (lambda (k)(exit k))
      where k is the continuation (lambda (v) (apply v '(1 2 3))
2.3- try to execute (exit k) but exit is a continuation
3- stop all calculus and E returns the result of
    ((lambda (v) (v 2)) (lambda (v) (apply v '(1 2 3)))
4- this generate an error.

If my understanding is good, then I don't understand why the  
following code generate an error:


 > ( (call/cc (lambda (exit)
              (apply (call/cc (lambda (k)(exit k))) '(1 2 3))
              )
            )
     + )

  procedure application: expected procedure, given: 6; arguments  
were: #<primitive:+>

It looks like the call to the continuation exit does not stop all  
current calculus.

Can someone explain me where I did wrong ?

Thank you

Ben


More information about the MSLUG mailing list