Scheme 使用';定义';计划中
我对Scheme还不熟悉,只是对“定义”很好奇。我见过这样的事情:Scheme 使用';定义';计划中,scheme,definition,Scheme,Definition,我对Scheme还不熟悉,只是对“定义”很好奇。我见过这样的事情: (定义(正方形x)(*x)) 这很有意义[函数名'square'输入参数'x']。然而,我发现了一些90年代的示例代码,并试图理解: (定义(播放循环iter strat0 strat1计数历史记录0历史记录1限制)(~code for function~) 除了函数名,所有这些输入参数都是吗?是,strat0到limit是播放循环iter函数的参数。简短回答-是,第一个参数后的所有符号都是程序的参数(第一个是程序的名称).此外
(定义(正方形x)(*x))
这很有意义[函数名'square'输入参数'x']。然而,我发现了一些90年代的示例代码,并试图理解:
(定义(播放循环iter strat0 strat1计数历史记录0历史记录1限制)(~code for function~)
除了函数名,所有这些输入参数都是吗?是,
strat0
到limit
是播放循环iter
函数的参数。简短回答-是,第一个参数后的所有符号都是程序的参数(第一个是程序的名称).此外,最好指出:
(define (f x y)
(+ x y))
这两种形式都是等价的:
(define f
(lambda (x y)
(+ x y)))
通常-使用特殊形式define
将名称绑定到值,该值可以是任何可用的数据类型,包括特定函数(lambda)
关于参数和过程定义的更多信息-很高兴知道
符号可用于定义具有可变数量参数的过程,例如:
(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
最后一个技巧是使用定义
(并非在所有解释器中都可用,但在Racket中有效)。定义返回过程的过程的快捷方式,如下所示:
(define (f x)
(lambda (y)
(+ x y)))
…这相当于以下较短的语法:
(define ((f x) y)
(+ x y))
((f 1) 2)
=> 3
定义的一般形式为:
(define (desired-name-of-procedure item-1 item-2 item-3 ... item-n)
(; what to do with the items))
另一种解释定义行为的方法是“组合方式”和“抽象方式”
[A] 简单地说,组合方式:
语法(item-1 item-2 item-3……item-n)
是Scheme(以及通常的Lisp)提供的基本组合方式
- 所有代码都是使用上述模式表示的列表
- 第一个(最左侧)项始终被视为运算符
- 括号强制运算符的应用程序…最左边的项需要接受后面的所有项作为参数
[B] 抽象的手段是一种简单的命名方式
一个示例将演示这一切是如何融入定义原语的思想的
示例--以自下而上的方式得出定义
考虑一下这个表达:
(lambda (x y) (* x y))
在简单的英语中,上面的表达式翻译为“创建一个接受两个参数并返回其乘积值的无名过程”。请注意,这将生成一个无名过程
更准确地说,在组合方式方面,Scheme为我们提供了关键字lambda
,作为创建用户定义过程的基本运算符
最左边的项--lambda
--作为参数传递项(xy)
和(*xy)
,运算符应用程序规则强制lambda
对这些项执行某些操作
内部定义lambda
的方式导致它解析列表(xy)
,并将x
和y
视为传递给列表的参数(*xy)
,其中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提供的“特殊形式”等等。就Scheme的解释器而言,以下两种定义是相同的:
(define (mul-two-things x y) (* x y))
(define mul-two-things (lambda (x y) (* x y))
是的,它们是输入参数……我只接受了塞普的答案,因为他是第一个。我真的很感激额外的信息,奥斯卡:)足够公平,尽管指出答案的标准很好(在:我应该选择哪个答案?)下)我也喜欢这样做:{define'x(*x)}
。然后我可以做:'2;=>4
:)。