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)として分類されますか?


5
REBOLの作成者からの回答は次のとおりです。REBOLは純粋な関数型言語ですか?
Greg Hewgill、2013

1
@GregHewgillそのリソースをありがとう。StackOverflow Rebolチャットルーム(chat.stackoverflow.com/transcript/message/7836761#7836761)でチャットした後、この質問をしました。彼ら(私たち)は、StackExchangeのプログラマや他のサイトにはこれに関する情報がないので、将来の参照のためにここで質問する必要があると考えました。そのリンクはすばらしいですが、ここで拡張して説明できるので、Rebolプログラマーの経験がないユーザーでも理解できます。その記事からの引用と個人的な開発経験のある回答をいただければ幸いです。
Benjamin Gruenbaum 2013

属性はカールのXMLシナリオをほとんど改善しません。メタデータ(属性名)と型なし値(属性コンテンツ)がまだ残っています。慎重に定義されたタイプによって提供されるRebolの暗黙のメタデータは、解釈の公正な負担を取り除きます。XMLでは、最初に値のロックを解除し、次にそれらを解読する必要があります(日付はXMLでどのように定義されますか?RSSまたはAtomの仕様を確認しますか?XMLで定義を表現できますか?)おそらくそれらを検証する必要があります。彼らの文脈を評価することができます。** [このコメント](programmers.stackexchange.com/questions/1

回答:


13

その正式な定義における「純粋な関数型プログラミング」とは、出力が純粋に「マシンへの入力の関数」である計算マシンを設計するアイデアに関するものです。同じ入力をマシンに入力すると、同じ出力が生成されます。各入力には明示的に名前が付けられているため、依存関係が正確にわかります。純粋な関数型プログラミング言語はこれを厳密に実行します。

しかし...ベースライン "Rebol"では、次のように記述できます。

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

ここでは、毎日の整数入力を返す関数を示していますが、今日は値に1を加えたものです。これには、関数への引数として正式に指定されていない日付に対する非表示の依存関係が含まれます。それは、Haskellの人々や、私自身のようなソフトウェアフォーマリストが血まみれの殺人を叫ぶようなものです。

したがって、Rebolはそのままでは純粋に機能しません。 (...でも読んで...)

関数型プログラミングのそれほど厳密ではない定義は、関数が言語の値として機能できる場合です。したがって、関数を変数に割り当てて、後で使用することができます。その意味で、JavaScriptは関数型言語であるということを読んで、危険な定義によって一部の人々はJavascriptが関数型言語であると言うようになることがわかります。もしあなたがその定義でそれを緩くするつもりなら、これは「機能的」でしょう:

>> foo: does [a + 10]

>> a: 20

>> print foo
== 30

(注:DOESは、引数なしで本体のみを持つ関数を定義するのに便利です。)

それ(またはJavaScript)を、私が話している人が関数型プログラミングと呼んでいるものに合うと考えるかどうかはわかりません。YMMV。

コンピュータサイエンスに時間を費やしている場合は、チューリングターピットや計算可能性、および「XをYに接続できればZが真になる」という同値のこの種の原理について学びます。そして、CでHaskell実装を作成し、HaskellライブラリにマップされたC呼び出しのみを使用するように制限できるのと同じように、「関数型プログラミング」を行っていて、技術的に正しいと主張するかもしれません。

したがって、Rebolを関数型プログラミングスタイルに曲げることができると言いたい場合は、悲観論者である可能性があります。「実際に、このような言語の限定されたサブセットを実際に使用しているときに、Cを実行しているふりをするのと同じです。「プロキシによってはHaskellを使用して再。Rebolの袖のトリックは、「方言」パラダイムから別のパラダイムにどれほど簡単に移行できるかです。たまたま機能的なドメイン固有言語を書くのはとても簡単で自然なことなので、それを行うために共同で言語をひねっているようには感じません。関数型の特性を持つドメイン固有の言語を作成する機能により、Rebolは「パラダイムニュートラル」としてラベル付けされます。

多くの人々は、Rebolを最も一般的な方言(DO方言)と混同して、「それがRebolとは何か」と考えています。しかし、Rebolの「エッセンス」はXMLに似ています。これは、偶然に(偶然ではなく)ある特定の方法で処理することに重点を置いて非常に最適化されたコードを偶然につまり、偶然ではなく)持つデータ交換フォーマットです。XMLからの脱却についての良い背景情報について、AmigaOS(そして現在はRebol)のカールサッセンラスが最初からXMLに欠陥があることを参照してください。


1
それは素晴らしい答えですが、「最初からXMLに欠陥があったのか」という記事はかなり悪いと思います。最初に、彼は貧弱なXMLを使用しています(入れ子で表すものはすべて属性で表すことができます)。次に、言語 xmlに似たツリーのような構造で表されます。文を解析すると、解析ツリーが表示されます。文法情報を含むXMLをドメイン固有の文字列と比較するのは公平ではありません。答えてくれてありがとう:)
Benjamin Gruenbaum

2
私はRebol n00bであり、あなたが言ったように、私もRebolがDO方言であると今考えています。この考え方から抜け出すことを願っています。:-)
KK。

1
@BenjaminGruenbaumカールのウェブサイトを編集できたら、信じてください。:-)
HostileForkはSEを信頼してはならないと2013

@BenjaminGruenbaumしかし、すべての言語がそのツリー構造を自由に操作できるわけではありません。Rebolはその点で非常に冷静です。
イズカタ2014年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.