这个方案代码是什么意思?(使用lambda定义&x27;列表&x27;运算符)
作为编译并返回参数列表的list运算符的定义,我在 但是,这与我所知道的常用lambda语法不匹配。我的意思是,lambda应该有括号中的参数等。请解释它是如何工作的。这定义了一个至少有零个参数的可变过程(一个可以接受不同数量参数的过程)。在本例中,所有参数都被捆绑到一个名为这个方案代码是什么意思?(使用lambda定义&x27;列表&x27;运算符),lambda,scheme,racket,Lambda,Scheme,Racket,作为编译并返回参数列表的list运算符的定义,我在 但是,这与我所知道的常用lambda语法不匹配。我的意思是,lambda应该有括号中的参数等。请解释它是如何工作的。这定义了一个至少有零个参数的可变过程(一个可以接受不同数量参数的过程)。在本例中,所有参数都被捆绑到一个名为args的列表中 下面是另一个可变过程示例(此过程至少需要一个参数),它返回传入的所有参数的最小值: (define (min arg1 . rest) (let loop ((val arg1)
args
的列表中
下面是另一个可变过程示例(此过程至少需要一个参数),它返回传入的所有参数的最小值:
(define (min arg1 . rest)
(let loop ((val arg1)
(rest rest))
(if (null? rest)
val
(let ((next (car rest)))
(loop (if (< next val) next val)
(cdr rest))))))
(定义(最小arg1.rest)
(let循环((val arg1)
(休息)
(如果为空,则为rest)
瓦尔
(让((下一个(汽车休息)))
(循环(如果(
尽管lambda中参数的一般形式似乎总是包含括号,但它不一定是必需的。如果看一看这本书,它说:
lambda的一般形式比我们前面看到的形式要复杂一些,因为形式参数规范(var…)不需要是一个适当的列表,甚至根本不需要是一个列表。形式参数规范可以采用以下三种形式之一:
粗体部分(由我设置的粗体部分)与您的问题非常相关。正如您的教程所说,它是一个被转换成列表的varargs参数。模式解释将形式参数规范与函数调用中提供的实际参数配对,从而进行某种受限模式匹配,形式参数规范作为一种模式 当它是长度
n
的适当列表时,这就像是说,将n
提供的每个参数值绑定到规范中的每个变量。方案要求在这种情况下提供确切的n
参数,尽管有些方言可能允许更多或更少,在不引起错误的情况下,此函数调用中的参数小于n
:
(define mylist (lambda (x y) ; (define (mylist x y) ; exactly two
(list x y))) ; (list x y)) ; arguments required
当它是一个包含n
变量和一个尾部变量的不正确列表时,这就像是说,如果给定的参数超过n
个,则会将其余变量作为列表绑定到该尾部变量。如果没有更多参数,自然会将空列表绑定到tail变量:
(define mylist (lambda (x . y) ; (define (mylist x . y) ; at least one
(cons x y))) ; (cons x y)) ; argument required
作为形式参数说明的唯一变量被标识为不正确列表的尾部变量,作为前一种情况的特定变量。因此,它将作为列表绑定到函数调用中提供的所有参数值:
(define mylist (lambda x ; (define (mylist . x) ; any number of
x)) ; x) ; arguments can be used
x
已经是一个包含所有提供参数的列表
显而易见,这三种情况都可以通过相同的代码转换来处理
(define (translate-define-to-lambda code)
(list (car code) ; "define"
(caadr code) ; name
(cons 'lambda
(cons (cdadr code) ; parameters
(cddr code)))))
(因为(cdr'()
=
)
(define (translate-define-to-lambda code)
(list (car code) ; "define"
(caadr code) ; name
(cons 'lambda
(cons (cdadr code) ; parameters
(cddr code)))))