Code: Select all
(define (make-square side)
(lambda (msg)
(cond ((eq? msg 'area) (* side side))
((eq? msg 'perimeter) (* 4 side))
(else (error "unknown message")))))
> (define s1 (make-square 4))
> (s1 'area)
> 16
Code: Select all
(define (make-square side)
(lambda (msg)
(cond ((eq? msg 'area) (* side side))
((eq? msg 'perimeter) (* 4 side))
(else (error "unknown message")))))
> (define s1 (make-square 4))
> (s1 'area)
> 16
Code: Select all
; make-square
; 2011-03-05
; example
; (set 's1 (make-square 2))
; (s1 'area) ;result = 4
; (s1 'perimeter) ;result = 8
; (s1 'xxx) ;result = "unknown message" error
(define (make-square side)
(letex (s side)
(lambda (msg)
(cond
((= msg 'area) (mul s s))
((= msg 'perimeter) (mul 4 s))
(true (throw-error "unknown message")) ))))
Code: Select all
> (new Class 'Square)
Square
> (define (Square:area) (* (self 1) (self 1)))
(lambda () (* (self 1) (self 1)))
> (define (Square:perimeter) (* 4 (self 1)))
(lambda () (* 4 (self 1)))
> (setq s1 (Square 4))
(Square 4)
> (:area s1)
16
> _
Code: Select all
> (new Class 'Square)
Square
> (setq Square:side 1)
1
> (define (Square:area) (* (self Square:side) (self Square:side)))
(lambda () (* (self Square:side) (self Square:side)))
> (define (Square:perimeter) (* 4 (self Square:side)))
(lambda () (* 4 (self Square:side)))
> (setq s1 (Square 4))
(Square 4)
> (:area s1)
16
> _
Code: Select all
> (new Class 'Square)
Square
> (context Square)
Square
Square> (setq side 1)
1
Square> (define (area) (* (self side) (self side)))
(lambda () (* (self side) (self side)))
Square> (define (perimeter) (* 4 (self side)))
(lambda () (* 4 (self side)))
Square> (context MAIN)
MAIN
> (setq s1 (Square 4))
(Square 4)
> (:area s1)
16
>
Thanks for translation. Can you explain why we need letex in this case? Why lambda can't take side from function definition?Sammo wrote:A direct translation of the Scheme code to newLisp might be:
Code: Select all
; make-square ; 2011-03-05 ; example ; (set 's1 (make-square 2)) ; (s1 'area) ;result = 4 ; (s1 'perimeter) ;result = 8 ; (s1 'xxx) ;result = "unknown message" error (define (make-square side) (letex (s side) (lambda (msg) (cond ((= msg 'area) (mul s s)) ((= msg 'perimeter) (mul 4 s)) (true (throw-error "unknown message")) ))))
I am neither a Scheme nor newLisp expert, but I believe the significant difference between them (for this example) lies in a concept called lexical closures.Can you explain why we need letex in this case? Why lambda can't take side from function definition?