Ho una domanda relativa allo schema, come possiamo implementare let * come espressione lambda. Per essere più precisi, non mi sto chiedendo il "regolare" let, ma il let con * che ci permette di usare una lascia espressione all'interno di un'altra.Come esprimere let * come espressione lambda (non regolare)
5
A
risposta
5
Il modulo let*
è una serie di nidificati lambda
s. Ad esempio, questo:
(let* ((a 10)
(b (+ 10 a)))
(+ a b))
equivale a questo:
((lambda (a)
((lambda (b)
(+ a b))
(+ 10 a)))
10)
+0
Grazie per la risposta, ora ha molto senso! –
4
Dal momento che non state chiedendo circa il 'normale' let
, se un let*
può essere convertito in let
allora si avrà la risposta . Pertanto sanno che:
(let* ((a ...) (b ...) (c ...)) body ...)
è equivalente a:
(let ((a ...))
(let ((b ...))
(let ((c ...))
body ...)))
(vedi R5RS, pagina 44, (define-syntax let* ...)
). Ora, dato questo, e la conoscenza che:
(let ((a ...)) body ...)
è equivalente a:
((lambda (a) body ...) ...)
l' 'espansione' del let*
che ho mostrato sopra diventa:
((lambda (a)
((lambda (b)
((lambda (c)
body ...)
<c-init>))
<b-init>))
<a-init>)
controllo questo fuori: http://stackoverflow.com/questions/15003518/confused-by-the-difference-between-let-and-let-in-scheme/15006018#15006018 –
grazie per il collegamento! –