我是 Scheme 的新手,只是对“定义”感到好奇。我见过这样的事情:
(define (square x) (* x x))
这是有道理的 [函数名称 'square' 输入参数 'x']。但是,我发现了一些 90 年代的示例代码,并试图弄明白:
(define (play-loop-iter strat0 strat1 count history0 history1 limit) (~Code for function~)
除了函数名称之外,所有这些输入参数都是什么?
简短回答 - 是的,第一个后面的所有符号都是过程的参数(第一个是过程的名称)。还需要指出的是:
(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)