这个方案代码是什么意思?(使用lambda定义&x27;列表&x27;运算符)

这个方案代码是什么意思?(使用lambda定义&x27;列表&x27;运算符),lambda,scheme,racket,Lambda,Scheme,Racket,作为编译并返回参数列表的list运算符的定义,我在 但是,这与我所知道的常用lambda语法不匹配。我的意思是,lambda应该有括号中的参数等。请解释它是如何工作的。这定义了一个至少有零个参数的可变过程(一个可以接受不同数量参数的过程)。在本例中,所有参数都被捆绑到一个名为args的列表中 下面是另一个可变过程示例(此过程至少需要一个参数),它返回传入的所有参数的最小值: (define (min arg1 . rest) (let loop ((val arg1)

作为编译并返回参数列表的list运算符的定义,我在

但是,这与我所知道的常用lambda语法不匹配。我的意思是,lambda应该有括号中的参数等。请解释它是如何工作的。

这定义了一个至少有零个参数的可变过程(一个可以接受不同数量参数的过程)。在本例中,所有参数都被捆绑到一个名为
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…)不需要是一个适当的列表,甚至根本不需要是一个列表。形式参数规范可以采用以下三种形式之一:

  • 一个适当的变量列表,(var1…varn),如我们已经看到的
  • 单个变量、varn或
  • 变量列表不正确,(var1…varn.varr)
  • 在第一种情况下,必须提供正好n个实际参数,并且每个变量都绑定到相应的实际参数在第二种情况下,任何数量的实际参数都是有效的;所有实际参数都放在一个列表中,单个变量绑定到此列表。


    粗体部分(由我设置的粗体部分)与您的问题非常相关。正如您的教程所说,它是一个被转换成列表的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)))))