2013-05-22 19 views
5

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)

+1

controllo questo fuori: http://stackoverflow.com/questions/15003518/confused-by-the-difference-between-let-and-let-in-scheme/15006018#15006018 –

+0

grazie per il collegamento! –

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>)