【问题标题】:Using 'define' in Scheme在方案中使用“定义”
【发布时间】:2013-04-11 21:37:49
【问题描述】:

我是 Scheme 的新手,只是对“定义”感到好奇。我见过这样的事情: (define (square x) (* x x)) 这是有道理的[函数名'square'输入参数'x']。但是,我发现了一些 90 年代的示例代码,并试图理解: (define (play-loop-iter strat0 strat1 count history0 history1 limit) (~Code for function~) 除了函数名,都是输入参数吗?

【问题讨论】:

  • 是的,它们是输入参数...

标签: scheme definition


【解决方案1】:

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

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

只是语法糖,两种形式是等价的:

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

通常 - 您使用特殊形式 definename 绑定到 value,该值可以是任何可用的数据类型,包括特定的函数( 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

最后一个技巧是define(并非在所有解释器中都可用,但在 Racket 中有效)。定义返回过程的过程的快速快捷方式,如下所示:

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

...相当于这个,更短的语法:

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

((f 1) 2)
=> 3

【讨论】:

  • 我只接受了 sepp 的回答,因为他是第一个。我非常感谢您提供的额外信息,奥斯卡 :)
  • 很公平,尽管指出accepting 答案的标准很好(在:我应该选择哪个答案?);)
  • 我也喜欢这样做:{ define 'x (* x x) }。然后我可以这样做:'2 ; => 4 :)。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    define 的一般形式是:

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

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

    [A]组合方式简单来说:

    语法(item-1 item-2 item-3 ... ... item-n)是Scheme(和一般的Lisp)提供的基本组合方式。

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

    [B] 抽象手段很简单;一种命名事物的方法。

    一个示例将演示这一切如何融入define 原语的概念...


    示例——以自下而上的方式到达define

    考虑这个表达式:

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

    用简单的英语,上面的表达式翻译为“创建一个接受两个参数并返回其乘积的值的nameless过程”。请注意,这会生成一个 nameless 过程。

    更准确地说,组合方式而言,Scheme 为我们提供了关键字lambda 作为创建用户定义过程的原始运算符。

    最左边的项目--lambda--作为参数传递项目(x y)(* x y),并且操作员应用程序规则强制lambda 对这些项目做一些事情。

    lambda 在内部定义的方式导致它解析列表(x y),并将xy 作为参数传递给列表(* x y)lambda 假定这是用户的定义遇到参数xy 时该怎么做。分配给xy 的任何值都将按照(* 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))
    

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 2014-05-30
      • 2016-01-30
      • 2014-05-17
      • 2017-05-11
      • 2020-09-01
      • 2016-03-19
      相关资源
      最近更新 更多