Rebol是一种功能编程语言吗?


9

我遇到了Rebol,我对此很纳闷。

我从这里遇到以下脚本:

 use [feed questions answers][
    feed: load-xml/dom http://stackoverflow.com/feeds/tag/rebol
    questions: map-each entry feed/get-by-tag <entry> [
        find/match entry/get <id> "http://stackoverflow.com/q/"
    ]

    answers: make block! length? questions

    foreach question questions [
        question: load-xml/dom join http://stackoverflow.com/feeds/question/ question
        foreach entry next question/get-by-tag <entry> [append answers entry/tree]
    ]

    insert clear feed/find-element <entry> answers
    feed/flatten
 ]

所有的集合操作操作都使map-each我想起了JavaScript和C#,它们都具有功能。

Rebol是功能语言吗?它支持函数式编程吗?它将分类为纯功能语言(PFL)吗?



1
@GregHewgill谢谢您的资源。在StackOverflow Rebol聊天室(chat.stackoverflow.com/transcript/message/7836761#7836761)聊天后,我问了这个问题。他们(我们)认为,由于在StackExchange上的程序员或其他站点上没有关于此的信息,我应该在这里询问以供将来参考。该链接很棒,但是可以在此处进行扩展和解释,以便更多没有经验的Rebol程序员的用户可以理解它。引用该文章和个人发展经验的答案将不胜感激。
本杰明·格伦鲍姆

属性几乎无法改善Carl的XML场景:您仍然有多余的元数据(属性名称)和未类型化的值(属性内容)。精心定义的类型提供的Rebol隐式元数据消除了解释上的负担。使用XML,您必须首先解锁值,然后解密它们(如何用XML定义日期?我应该检查RSS还是Atom规范?可以用XML表示定义吗?),然后可能验证它们,只有这样才能验证可以评估他们的背景。**拟作为响应于[此评论](注释programmers.stackexchange.com/questions/1

Answers:


13

正式定义中的“ 函数式编程”是关于设计计算机的想法,其输出纯粹是“计算机输入的函数”。如果将相同的输入送入机器,它将产生相同的输出。每个输入都被明确命名,因此您可以精确地知道依赖项是什么。纯函数式编程语言严格执行此操作。

但是...在基准“ Rebol”中,您可以编写如下内容:

foo: function [value [integer!]] [
    either now/date = 20-Feb-2013 [
        value + 1
    ] [
        value
    ]
]

在这里,我们看到一个函数,该函数每天(但今天)返回其整数输入,在那里您得到的值加一。它包括对日期的不可见依赖关系,该依赖关系未正式指定为函数的参数。这种事情使Haskell员工和像我这样的软件形式主义者尖叫着血腥的谋杀。

因此雷博尔不是盒子的功能进行。 (...但请继续阅读...)

函数编程的较不严格定义是函数可以充当语​​言中的值的时间。因此,您可以将函数分配给变量,并在以后使用。从这个意义上讲,您可以阅读javascript是一种功能语言之类的东西,然后发现dicey定义会导致某些人说Javascript是一种功能语言。如果您对定义的定义过于宽松,那么它将是“功能性的”:

>> foo: does [a + 10]

>> a: 20

>> print foo
== 30

(注意:DOES是定义不带参数的函数的便利,该函数只有一个主体。)

我不知道我会认为(或JavaScript)适合与我交谈的人所说的函数式编程。YMMV。

如果您花任何时间学习计算机科学,您将了解诸如Turing Tarpits和可计算性之类的东西以及这些等效原理,其中“如果您可以将X连接到Y,那么Z就是正确的”。正如您可以用C编写Haskell实现,然后将自己限制为仅使用映射到Haskell库中的C调用一样,您可能会声称您正在执行“函数式编程”并且在技术上是正确的。

因此,如果您想说Rebol可以偏向于函数式编程风格,那么您可能会感到悲观,并说:“当您实际上在使用有限的语言子集时,最好不要假装自己正在使用C语言。重新通过代理使用Haskell”。Rebol袖子的窍门是,您从一种“辩证”范式滑到另一种范式的难度。编写一种碰巧可以正常工作的领域特定语言是如此简单和自然,以至于您不会觉得自己是一头雾水。制作具有功能特征的领域特定语言的能力导致Rebol被标记为“范式中立”

许多人将Rebol与最普通的方言(DO方言)混合在一起,并认为“这就是Rebol是什么”。但是Rebol的“本质”更像XML,它是一种数据交换格式,巧合地(好的,不是巧合的)具有高度优化的代码,专注于以某些特定方式对其进行处理。要获得有关如何克服XML的良好背景知识,请参阅AmigaOS(现在是Rebol)的成名者Carl Sassenrath撰写的XML是有缺陷的


1
这是一个很好的答案,但我认为“从一开始就存在XML缺陷”一文就很糟糕。首先,他使用了较差的XML(他用嵌套表示的所有内容都可以用属性表示)。其次,语言由树状结构类似于XML表示。当您解析一个句子时,您会得到一棵解析树,将包含语法信息的XML与特定于域的字符串进行比较是不公平的。感谢您的回答:)
Benjamin Gruenbaum 2013年

2
我是Rebol n00b,正如您所说,我现在也一直在想Rebol是DO方言。希望打破这种思维定势。:-)
KK。

1
@BenjaminGruenbaum如果我可以编辑Carl的网站,请相信我,我会的。:-)
HostileFork说不要相信

@BenjaminGruenbaum但是并不是所有的语言都可以自由地操纵树结构。Rebol在这方面非常轻率。
Izkata 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.