2016-04-08 20 views
1

Ben sözcüksel clojures hakkında Lambda'ya üzerinde Let okumak ve bu kod örneği Common Lisp için verildi: Ne kadar Racket bu yazma çalıştıRaket kullanarak sözcük kapanışları

(let ((counter 0)) 
    (lambda() (incf counter))) 

:

(let ((counter 0)) 
    (lambda() (+ counter 1))) 

zaman unde I kadarıyla

counter: undefined; 
cannot reference an identifier before its definition 

: bana hata verir counter olarak Repl kimseyi arama rstood, lambda ile karıştırma/karıştırma, bir lambda, diğer işlevler tarafından işlenebilen, insan hafızasının duyulardan gelen girdi ile işlenip değiştirilebileceği bir şekilde saklanmasına olanak verir. LISP programlarında diğer işlevlerle etkileşimleriyle değiştirilen kod parçalarına sahip olmakla ilgileniyorum. Bu lambda tarafından yapılmasa bile, hala onu (lambda işlevi) anlamak istiyorum, çünkü Racket ve diğer LISP lehçelerinin önemli bir parçası gibi görünüyor. şema/raket ile

cevap

4

(incf x) Racket içinde (+ x 1) eşdeğer değildir ancak ilk x artan birleşimidir: (set! x (+ x 1)) ve sonra yeni değeri dönüyor. Eğer Racket benzer bir işlev tanımlamak istiyorsanız

Yani, örneğin, bu yazabilirsiniz:

(define count 
    (let ((counter 0)) 
    (lambda() (begin (set! counter (+ counter 1)) counter)))) 

(count) ; returns 1 

(count) ; returns 2 
+0

Mükemmel çalışıyor. Bu tekniğiyle yeniden yazacağım, geçmişte yaptığım bazı işlevleri, lambda'ya izin vermeyi gerçekten anlayabiliyor muyum diye. Teşekkürler! –

0

, siz (btw set!infc aksine yeni değer döndürmez) set! yerine Lisp fonksiyonu olan incf kullanımı gerekir. Common Lisp

İlgili konular