#lang racket (require racket/control) (define damn0 (lambda () 'id)) (define damn1 (lambda () (cons '("side effect" bad) 'id))) (define damn2 (lambda () (shift k (cons '("side effect" bad) (list (k 'id)))))) (define damn3 (lambda () (shift k (list (k 'id) '("side effect" bad))))) ; Now if we use damn0, our compositional semantics will work OK but ; we don't yet have any expressive contribution: (list "main content" 'i (list 'like (list 'the (damn0) 'boy))) ; '("main content" i (like (the id boy))) ; If we use damn1, we've added in the expressive side-effect: (list "main content" 'i (list 'like (list 'the (damn1) 'boy))) ; '("main content" i (like (the (("side effect" bad) . id) boy))) ; However, the context (list 'the ... 'boy) is now being asked to operate ; on an element (("side effect" bad) . id), and it may complain it doesn't ; know what that is. It knows how to use 'id to get (list 'the 'id 'boy), ; and how to use 'bad to get (list 'the 'bad 'boy), but we're supposed to ; have something different here. ; To get what we want we need to use (delimited) continuations: (reset (list "main content" 'i (list 'like (list 'the (damn2) 'boy)))) ; '(("side effect" bad) ("main content" i (like (the id boy)))) ; or to get the side effect at the end: (reset (list "main content" 'i (list 'like (list 'the (damn3) 'boy)))) ; '(("main content" i (like (the id boy))) ("side effect" bad)) ; If you're working in the interactive interpreter, the outermost "reset" here ; is already in its default position, so it doesn't need to be explicitly ; specified: (list "main content" 'i (list 'like (list 'the (damn2) 'boy))) ; '(("side effect" bad) ("main content" i (like (the id boy)))) ; However, if you're executing this as a file, you would need to include explicit resets. ; Instead of using reset/shift you could use an element like "print" in ; building the side-effect, as we did in class. Here you wouldn't require an ; explicit continuation, but as Chris said, that's because "print" already ; represents an implicit continuation. (define damn4 (lambda () (begin (print "bad") 'id))) (list "main content" 'i (list 'like (list 'the (damn4) 'boy))) ; "bad"'("main content" i (like (the id boy))) ;