27

3つのlispy同像性言語、DylanJulia、およびSephはすべて、先頭の括弧から離れました-したがって、CommonLispでの架空の関数呼び出しは次のようになります。

(print hello world)

次の架空の関数呼び出しのようになります

print(hello world)

上記の3つの言語で。

Clojureがこの道を進むとしたら、そこにたどり着くために何を犠牲にする必要がありますか?

理由:Clojureの驚くべき怠惰な機能データ構造、およびマップとシーケンスの改善された構文、並行性の言語サポート、JVMプラットフォーム、ツール、および素晴らしいコミュニティは別として、それが「LISP」であることの特徴は構文の抽象化を提供するマクロを与える同像性を与える先頭の括弧。

しかし、先頭の括弧が必要ない場合は、なぜそれらを使用するのですか?それらを維持するために私が考えることができる唯一の議論は

(1)emacsでのツールサポートの再利用

(2)人々に「LISPで考える」ように促し、それを別の手続き型言語として扱わないようにする)

4

9 に答える 9

24

(WheelerとGloriaの「ReadableLisp S-expressions Project」へのリンクを提供した、Andrew Cookeの回答へのクレジット)

上記のリンクは、S式やClojureを含むすべての言語に読みやすい構文を提供することを目的としたプロジェクトです。結論はそれができるということです:括弧なしで読みやすいLispを持つ方法があります

基本的に、David Wheelerのプロジェクトは、Lispのような言語に構文糖衣構文を追加して、ドメイン固有言語に対するLispのサポートを壊さない方法でより現代的な構文を提供することです。拡張機能はオプションであり、下位互換性があるため、必要なだけ追加したり、既存のコードと組み合わせたりすることができます。

このプロジェクトでは、次の3つの新しい式タイプを定義します。

  • 中置式。 (+ 1 2 3)は、任意の中置演算子を使用するすべての場所で{1 + 2+3}になります。(インライン式で{1 + 2 * 3}のように複数の演算子を使用する場合は、注意が必要な特殊なケースがありますが、{1 + {2 * 3}}は期待どおりに機能します)。
  • 新詩派の表現。(fxy)はf(xy)になります(関数名とそのパラメーターの間にスペースを入れないようにする必要があります)
  • 甘い表現。開いているparensと閉じているparensは、(オプションの)pythonのようなセマンティックインデントに置き換えることができます。甘い表現は、従来の括弧のS式と自由に組み合わせることができます。

その結果、Lispに準拠しますが、はるかに読みやすいコードになります。新しいシンタックスシュガーが読みやすさを向上させる方法の例:

(define (gcd_ a b)
    (let (r (% b a))
        (if (= r 0) a (gcd_ r a))))

(define-macro (my-gcd)
    (apply gcd_ (args) 2))

になります:

define gcd_(a b)
    let r {b % a}
        if {r = 0} a gcd_(r a)

define-macro my-gcd()
    apply gcd_ (args) 2

構文がマクロとどのように互換性があるかに注意してください。これは、Lisp構文を改善することを目的とした以前のプロジェクトの問題でした(WheelerとGloriaによって説明されています)。これは単なる砂糖であるため、新しい各式の最終的な形式はS式であり、マクロが処理される前に言語リーダーによって変換されます。したがって、マクロは特別な処理を必要としません。したがって、「読み取り可能なLisp」プロジェクトは、同像性、つまりLispが言語内のデータとしてコードを表現できるようにするプロパティを保持します。これにより、Lispは強力なメタプログラミング環境になります。

于 2013-07-08T10:37:57.827 に答える
23

関数呼び出しのために括弧を1つのアトムに移動するだけでは、だれも満足させるのに十分ではありません。人々は中置演算子、開始/終了ブロックなどの欠如について不平を言うでしょう。さらに、あなたはおそらくあらゆる種類の場所にコンマ/区切り文字を導入しなければならないでしょう。

それらにそれを与えると、マクロは正しく書くだけではるかに難しくなります(そして、それまでに導入したすべての新しい構文で見た目も動作もうまくいくマクロを書くのはおそらくさらに難しいでしょう)。また、マクロは、無視したり、さらに煩わしいものにしたりできる優れた機能ではありません。言語全体(他のLispと同様)はそれらの上に構築されています。let、def、defnなどを含むclojure.coreにある「ユーザーに表示される」もののほとんどはマクロです。

于 2012-03-02T12:43:01.153 に答える
14

構造が単純ではなくなったため、マクロの記述ははるかに困難になります。式の開始と終了をエンコードする別の方法が必要になります。構文記号を使用して式の開始と終了をマークし、式を生成するコードを記述できます。(式の開始をマークするためにaのようなものを追加することにより、この問題を解決します。

まったく別の角度で、このビデオを見る価値があります。Lisp構文をより馴染みのあるものにすることと簡単にすることの違いは、人々が習得しやすくなることはなく、そうでないもののように見える場合は誤解を招く可能性があります。

あなたが完全に同意しなくても、そのビデオは1時間の価値があります。

于 2012-03-02T17:19:52.630 に答える
13

何も犠牲にする必要はありません。完全に透過的で下位互換性があり、マクロなどを完全にサポートする、DavidWheelerによる非常に慎重に考え抜かれたアプローチがあります。

于 2012-03-08T22:29:53.747 に答える
5

あなたはMathematicaを持っているでしょう。Mathematicaは関数呼び出しをとして受け入れますが、さらに調査すると、 (要素0)がであり、(要素1からN)がであるリストの実際の構文糖衣であるf[x, y, z]ことがわかります。S式によく似たリストから関数呼び出しを作成したり、未評価の関数をリストに分解したりできます(Lispの場合と同様に、評価を防ぎます)。f[x, y, z]HeadfRest{x, y, z}Holdquote

MathematicaとLisp/Schema / Clojureの間には意味上の違いがあるかもしれませんが、Mathematicaの構文は、左括弧を1アトム上に移動し、それを適切に解釈したり、マクロを使ってコードを作成したりできることを示しています。

構文はプリプロセッサを使用して変換するのは非常に簡単です(セマンティクスよりもはるかに簡単です)。ClojureのLispReaderを巧妙にサブクラス化することで、必要な構文を取得できる可能性があります。Clojureの不快な括弧をすべて角括弧に置き換えることで、それらを解決しようとするプロジェクトもあります。(これが大したことだと考えられているのは気が遠くなります。)

于 2014-01-31T16:59:10.543 に答える
2

「コードはデータである」という哲学は、信頼できるメタプログラミングを可能にするものです。複雑な構文を持つPerl/Rubyと比較すると、メタプログラミングへのアプローチは非常に限られた状況でのみ信頼できます。Lispメタプログラミングは完全に信頼できるので、言語のコアはそれに依存しています。この理由は、コードとデータによって共有される統一された構文(同像性の特性)です。S式は、この均一性を実現する方法です。

そうは言っても、Clojureには、暗黙の括弧が可能な状況があります。

たとえば、次の3つの式は同等です。

  1. (最初(rest(rest [1 2 3 4 5 6 7 8 9])))
  2. (-> [1 2 3 4 5 6 7 8 9](休憩)(休憩)(最初))
  3. (-> [1 2 3 4 5 6 7 8 9]残りを最初に休ませます)

3番目のマクロは、このコンテキストで括弧を推測し、それによって括弧を省略できることに注意してください。このような多くの特殊なケースのシナリオがあります。一般に、Clojureの設計は、括弧が少ない側で誤りがあります。たとえば、condの括弧を省略するという物議を醸す決定を参照してください。Clojureは非常に原理的であり、この選択について一貫しています。

于 2012-03-08T15:36:47.567 に答える
2

以前はC/C#/ Java / Pascalをコーディングしていたので、Lispコードは少し異質であるという感覚で強調します。しかし、その感覚は数週間しか続きません-かなり短い時間の後、Lispスタイルは非常に自然に感じられ、あなたはそれらの「不規則な」構文のために他の言語を打ち負かし始めるでしょう:-)

Lisp構文には非常に正当な理由があります。先頭の括弧は、関数とその引数を構成する式の両方を1つの形式で収集することにより、コードの解析と読み取りを論理的に簡単にします。

そして、コードを操作したりマクロを使用したりする場合、重要なのはこれらの形式です。これらはすべてのコードの構成要素です。したがって、最初の要素をフォームの外に任意に残すのではなく、これらのフォームを正確に区切る場所に括弧を配置することは基本的に理にかなっています。

于 2012-03-03T02:14:30.137 に答える
1

興味深いことに、別のRacket構文があります。

@foo{blah blah blah}

として読みます

(foo "blah blah blah")
于 2014-09-12T07:30:57.443 に答える
0
Were Clojure to go down this path - what would it have to sacrifice to get there?

犠牲は、リストのリストのリストを作成することによってコードを書くことの感覚/メンタルモーダルです..またはより技術的には「ASTを直接書く」ことです。

注:他の回答で述べられているように、他にも怖がることがあります。

于 2012-03-02T16:39:42.297 に答える