如果可以是一个适当的职能,而不是一种特殊形式
-
19-09-2019 - |
题
我终于开始学习的功能性的语言(emacs口齿不清),这使得明显的区别之间的功能和特殊形式,如流动的控制,例如,如果。
有的根本/理论原因为什么特殊形式不同的功能吗?做任何一种语言提供的功能 if
?
感谢
解决方案
与渴望评估的区别是需要、语言与懒惰的评价(即Haskell)如果et al.可以功能。
渴望评估:功能的计算参数 之前 调功能,而只有结果传递给功能。
懒惰的评估:一个功能的论点进行评估,如果并且只有如果他们访问。
其他提示
在语言,如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微积分 为等值基础计算。但是,在语言具有副作用(如分配的变量)也是没有多大用处的,因为 时 事情发生是很重要的。