我终于开始学习的功能性的语言(emacs口齿不清),这使得明显的区别之间的功能和特殊形式,如流动的控制,例如,如果。

有的根本/理论原因为什么特殊形式不同的功能吗?做任何一种语言提供的功能 if?

感谢

有帮助吗?

解决方案

与渴望评估的区别是需要、语言与懒惰的评价(即Haskell)如果et al.可以功能。

渴望评估:功能的计算参数 之前 调功能,而只有结果传递给功能。

懒惰的评估:一个功能的论点进行评估,如果并且只有如果他们访问。

其他提示

如果 if 是一个正常的功能,那么它的两个参数--的 然后形式其他形式—会 被评估的 之前if 功能,因为这是规则 评价功能:评估 所有的论点 产生的数值,然后提供的序列数值作为论据的功能指定的第一号清单。

相反,用 if 什么你想要做的就是评估一个的 然后形式其他形式, 不这两者。为了抑制评估的一个或其他的,你需要一个宏或 特殊形式.

在语言,如Emacs口齿不清的和共同的口齿不清,特别形式是语言结构。他们有不同的评价规则的正常功能的电话。正常功能的电话的所有参数进行评估。所以,你不能写一,如果作为一个正常功能的条件确定哪些条款得到评估。还通常你不能书写自己的特殊的形式在公共口齿不清,没有语言结构定义的一种特殊形式(虽然个别的实现必须实施现有的人不知。这导致宏。与宏你可以写一句法的转变,改变的一种表达成另外一个。能写如果作为一个宏观,需要有另一个条件的形式,这可以使用的变码。口齿不清提供了条件的基本结构。让我们假设条件是这样一个基本构造,然后你可以扩大如果成使用条件

我的-如果作为一个宏观的共同List:

(defmacro my-if (condition true-clause false-clause)
   `(cond (,condition ,true-clause)
          (t ,false-clause)))

所以

(my-if (foo-p) 'one 'two)

获取扩大到

(cond ((foo-p) 'one)
      (t 'two))

为完整性:没有任何特殊形式的 Pico 语言,例如,和 if 是一种原始的 功能 同时微微的灵感来自方案和有渴望评估的默认。

在计划你可以写

(define (true t f)
  (t))

(define (false t f)
  (f))

(define (function_if c t e)
  (c t e))

然后

(function_if true (lambda () 'true) (lambda () 'false))
==> true

是什么让这个易于管理,在Pico是,你可以定义 功能参数 采取功能的论据是"自动"延迟。这意味着你不需要做的包装内部lambda自己。微微因此急切的评估,但与懒评估需求,绕过需要特殊形式。

因此,在方案法官能参数可以编码布尔为:

(define (true (t) (f))
  (t))

(define (false (t) (f))
  (f))

然后功能,如果变成:

(define (function_if c (t) (e))
  (c (t) (e)))

(function_if true 'true 'false)
==> true

作为另一个例子,该定义功能 and(define (and p (q)) (p (q) false)).

同样可以定义 or, not, while, for,...作为功能,使用上述编码的布尔.

简短的回答:没有。

长(er)的答案:(如果...)要求控制评估顺序的论点。口齿不清,作为一个渴望的语言无法做到这一功能。

解决办法:做一个宏:

(defmacro _if (cnd true false)
    (let (  (gcond (gensym))
            (gresp (gensym)))
        `(let ( (,gcond ,cnd) ;`#quotes
                (,gresp nil))        
            (and ,gcond       (setf ,gresp (multiple-value-list ,true)))
            (and (not ,gcond) (setf ,gresp (multiple-value-list ,false)))
            (values-list ,gresp))))

例如:

[dsm@localhost:~]$ clisp -q
[1]> (defmacro _if (cnd true false)
    (let (  (gcond (gensym))
            (gresp (gensym)))
        `(let ( (,gcond ,cnd) ;`#quotes
                (,gresp nil))        
            (and ,gcond       (setf ,gresp (multiple-value-list ,true)))
            (and (not ,gcond) (setf ,gresp (multiple-value-list ,false)))
            (values-list ,gresp))))
_IF
[2]> (_if (= 1 1) (+ 2 3) "bar")
5
[3]> (_if (= 1 2) (+ 2 3) "bar")
"bar"
[4]> 

在卡拉这是可能的模型 if 有正确的侧效评估使用按名称的争论。

def If[A](cond : Boolean, truePart : => A, falsePart : => A) = if (cond) truePart else falsePart

这些特征可以用来模型很多 新的控制结构 为好。

如果可能是一个功能在一个功能性的语言,具有按名义(懒评估),作为在Lambda石或陵.事实上,是的,我认为,在心之间的关系 图灵机和Lambda微积分 为等值基础计算。但是,在语言具有副作用(如分配的变量)也是没有多大用处的,因为 事情发生是很重要的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top