let*是Scheme语言中一种常用的赋值方式,今天想到了一种使用lambda演算解释let*的方式。
首先我们知道let*的语法定义如下:
(let* ( [ var val ] ...) body ... )
其语义是在环境中求值val,与var绑定后,加入环境,构成新环境,然后在新环境中求值val2...,最后在得到的环境中,求值body
用scheme来解释是这样的:
(define (eval-let* argslist body env) (let ((new-env (extend-env* argslist env))) (eval body new-env))) (define (extend-env* argslist env) (cond ((null? argslist) env) (else (let ((var (first (first argslist))) (val (second (first arglist)))) (extend-env* (cdr arglist) (extend-env var (eval-expr val env) env))))))
最后我想到其实用lambda演算解释起来更加的简单:
((lambda (var1) ((lambda (var2) (... (lambda () body1 ...))) val2)) val1)
现在想的是用lambda去解释let反而感觉是一件比较麻烦的事了。
时间: 2024-09-30 15:51:47