2013-04-11 73 views
1

我是Scheme新手,对'define'感到好奇。我见过这样的东西: (define (square x) (* x x)) 这是有道理的[功能名'方'输入参数'x']。但是,我发现了一些来自90年代的示例代码,并且试图理解: (define (play-loop-iter strat0 strat1 count history0 history1 limit) (~Code for function~) 除了函数名称,所有这些输入参数?在计划中使用'define'

+0

是的,他们是输入参数... – piokuc 2013-04-11 21:39:10

回答

3

简短的回答 - 是的,第一个之后的所有符号都是该过程的参数(第一个是过程名称)。此外,它是很好的指出这一点:

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

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

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

一般的 - 使用特殊形式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 

以及一个最终招用define (在所有口译人员中都不可用,但在Racket中工作)。一个快捷键定义返回程序的程序,像这样的:

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

...这等同于这一点,更短的语法:

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

((f 1) 2) 
=> 3 
+0

我只接受的Cuz他是第一个SEPP的答案。我真的很感激额外的信息,奥斯卡:) – V1rtua1An0ma1y 2013-04-11 22:21:37

+1

不够公平,尽管指出[接受](http://meta.stackexchange.com/a/5235/170230)答案的标准是很好的我选择?);) – 2013-04-11 22:23:25

+0

我也喜欢这样做:'{define'x(* xx)}'。然后我可以这样做:''2; => 4' :)。 – Alexey 2013-04-12 20:02:06

1

是的,strat0limitplay-loop-iter函数的参数。

0

为定义的一般形式是:

(define (desired-name-of-procedure item-1 item-2 item-3 ... item-n) 
     (; what to do with the items)) 

另一种解释define行为的方式是“组合手段”和“抽象手段”。

[A]组合的用简单的术语的手段:(和Lisp一般)

语法(item-1 item-2 item-3 ... ... item-n)是通过方案提供组合的基本手段

  • 所有码是使用上述模式表示的列表
  • 第一个(最左边的)项目始终视为运算符
  • 括号强制运算符的应用程序... Th È最左边项目需接受所有后面的项目,作为参数

[B]抽象装置是简单地;一种命名事物的方式。

一个例子将展示这一切是如何折叠成define原始的想法...


示例 - 自下而上的方式

考虑这个表达在define到达:

(lambda (x y) (* x y)) 

用普通的英语,上述表达式转换为“Create一个无名接受两个参数的过程,并返回其产品的值“。请注意,这会生成一个无名称的过程。

更准确地说,在组合手段而言,方案为我们提供的关键字作为lambda创建用户定义的过程的原语运算符。

最左边的item-- lambda --is通过项目(x y)(* x y)作为参数,和运营商的应用规则的力量lambda做的项目的东西。

方式lambda被内部定义使其解析列表(x y),和治疗xy作为参数传递给列表(* x y),这lambda假设是做什么用户的定义中遇到的论点xy时。将根据规则(* x y)处理分配给xy的任何值。

输入,手段抽象的...

假设我想指这类乘法的在几个地方在我的计划,我可能会调整上述lambda表达式是这样的:

(define mul-two-things (lambda (x y) (* x y))) 

define以mul-two-things和lambda表达式作为参数,并且“绑定”它们在一起。现在Scheme知道mul-two-things应该与一个过程相关联,以获取两个参数并返回它们的产品。

碰巧,命名过程的要求非常普遍,并且提供了如此多的表达力量,所以Scheme提供了一个更清晰的快捷方式。

像@ oscar-lopez说的,define是“特殊形式”Scheme提供的,用来命名事物。而据方案的解释而言,下面的两个定义是相同的:

(define (mul-two-things x y) (* x y)) 
(define mul-two-things (lambda (x y) (* x y))