在 Scheme 中使用“定义”

V1r*_*a1y 4 scheme definition

我是 Scheme 的新手,只是对“定义”感到好奇。我见过这样的事情: (define (square x) (* x x)) 这是有道理的 [函数名称 'square' 输入参数 'x']。但是,我发现了一些 90 年代的示例代码,并试图弄明白: (define (play-loop-iter strat0 strat1 count history0 history1 limit) (~Code for function~) 除了函数名称之外,所有这些输入参数都是什么?

Ósc*_*pez 8

简短回答 - 是的,第一个后面的所有符号都是过程的参数(第一个是过程的名称)。还需要指出的是:

(define (f x y)
  (+ x y))
Run Code Online (Sandbox Code Playgroud)

这只是语法糖,两种形式是等价的:

(define f
  (lambda (x y)
    (+ x y)))
Run Code Online (Sandbox Code Playgroud)

通常 - 您使用特殊形式define名称绑定到,该值可以是任何可用的数据类型,包括特定的函数(lambdas)。

关于参数和过程定义的更多信息 - 很高兴知道该.表示法可用于定义具有可变数量参数的过程,例如:

(define (f . x) ; here `x` is a list with all the parameters
  (apply + x))

(f 1 2 3 4 5)   ; 0 or more parameters can be passed
=> 15
Run Code Online (Sandbox Code Playgroud)

还有最后一个技巧define(并非在所有解释器中都可用,但在 Racket 中有效)。定义返回过程的过程的快捷方式,如下所示:

(define (f x)
  (lambda (y)
    (+ x y)))
Run Code Online (Sandbox Code Playgroud)

...相当于这个,更短的语法:

(define ((f x) y)
  (+ x y))

((f 1) 2)
=> 3
Run Code Online (Sandbox Code Playgroud)