scheme - 在 Scheme 中使用 'define'

标签 scheme definition

我是 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))

只是语法糖,两种形式是等价的:
(define f
  (lambda (x y)
    (+ x y)))

一般来说 - 您使用特殊形式 define为了将名称绑定(bind)到值,该值可以是任何可用的数据类型,包括特定的函数(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

最后一招 define (并非在所有口译员中都可用,但在 Racket 中有效)。定义返回过程的过程的快速快捷方式,如下所示:
(define (f x)
  (lambda (y)
    (+ x y)))

...这相当于这个,更短的语法:
(define ((f x) y)
  (+ x y))

((f 1) 2)
=> 3

关于scheme - 在 Scheme 中使用 'define',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15959319/

相关文章:

scope - Racket 中的 `match` 可以具有来自外部范围的变量的模式吗?

lisp - SICP car/cdr练习题问题

arrays - 什么是无界数组?

c++ - 如何定义一个可以保存可变模板参数的类?

c - 下面声明的类型不应是不完整类型的声明是什么意思

C++ 宏不正确地终止宏调用

按方案中的第一个元素对列表列表进行排序

list - 在 Scheme 中将列表的列表合并为一个列表

scheme - 在Scheme : bad idea?中实现 "Pythonic"映射

c++ - 具有用户定义的指针成员的对象的赋值运算符