我是Scheme新手,对'define'感到好奇。我见过这样的东西: (define (square x) (* x x))
这是有道理的[功能名'方'输入参数'x']。但是,我发现了一些来自90年代的示例代码,并且试图理解: (define (play-loop-iter strat0 strat1 count history0 history1 limit) (~Code for function~)
除了函数名称,所有这些输入参数?在计划中使用'define'
回答
简短的回答 - 是的,第一个之后的所有符号都是该过程的参数(第一个是过程名称)。此外,它是很好的指出这一点:
(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
我只接受的Cuz他是第一个SEPP的答案。我真的很感激额外的信息,奥斯卡:) – V1rtua1An0ma1y 2013-04-11 22:21:37
不够公平,尽管指出[接受](http://meta.stackexchange.com/a/5235/170230)答案的标准是很好的我选择?);) – 2013-04-11 22:23:25
我也喜欢这样做:'{define'x(* xx)}'。然后我可以这样做:''2; => 4' :)。 – Alexey 2013-04-12 20:02:06
是的,strat0
到limit
是play-loop-iter
函数的参数。
为定义的一般形式是:
(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)
,和治疗x
和y
作为参数传递给列表(* x y)
,这lambda
假设是做什么用户的定义中遇到的论点x
和y
时。将根据规则(* x y)
处理分配给x
和y
的任何值。
输入,手段抽象的...
假设我想指这类乘法的在几个地方在我的计划,我可能会调整上述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))
- 1. 在计划中使用“和”
- 2. GCC在#define中需要下划线?
- 3. 在printf中使用#define?
- 4. 在LOOP中使用“at”CMD的计划
- 5. 如何在计划中使用“cond”?
- 6. 在计划中使用追加
- 7. 在Excel中使用VBA制定计划
- 8. 计划在Java中
- 9. 使用Quartz计划作业
- 10. 重复使用FFTW3计划
- 11. 使用DDD建模计划
- 12. 使用计划任务
- 13. 计划使用eclipse IDE
- 14. 使用cmd在C++中添加#define
- 15. 语言中使用#define在.PCH
- 16. #define在java中使用/ android studio
- 17. 在“if”语句中使用#define
- 18. 如何在宏中使用if(define)?
- 19. 如何在计划中使用计数器
- 20. 魔法1089在计划使用Dr.Retet
- 21. 不使用的#define
- 22. 使用#define from宏
- 23. RAII在计划?
- 24. 计划,中止
- 25. 在Haskell中计划超时
- 26. 幻方正在计划中
- 27. Optaplanner - 在使用多个计划变量时链接计划实体'腐败'
- 28. 谁计划回到在ASP.NET 4.0中使用Web应用程序?
- 29. 在Delphi中使用{。$ DEFINE VAR}而不是{$ DEFINE VAR}的目的是什么
- 30. 追加!在计划?
是的,他们是输入参数... – piokuc 2013-04-11 21:39:10