Scheme 使用';定义';计划中

Scheme 使用';定义';计划中,scheme,definition,Scheme,Definition,我对Scheme还不熟悉,只是对“定义”很好奇。我见过这样的事情: (定义(正方形x)(*x)) 这很有意义[函数名'square'输入参数'x']。然而,我发现了一些90年代的示例代码,并试图理解: (定义(播放循环iter strat0 strat1计数历史记录0历史记录1限制)(~code for function~) 除了函数名,所有这些输入参数都是吗?是,strat0到limit是播放循环iter函数的参数。简短回答-是,第一个参数后的所有符号都是程序的参数(第一个是程序的名称).此外

我对Scheme还不熟悉,只是对“定义”很好奇。我见过这样的事情:
(定义(正方形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
:)。