S式の読みやすさ


9

一言で言えば、それを知らなかった人のために、Lisp関数/演算子/構造体はすべて次のように一律に呼び出されます:

(function arg0 arg1 ... argN)

では、Cのような言語では次のように表現します

if (a > b && foo(param))

のようなLisp sexpに変換されます

(if (and (> a b) (foo param)))

。物事がより現実的/複雑になるにつれて、対応するs式も私にとってはそうなります。

私はこれが主観的な質問である可能性が高いことを認識していますが、多くのLispハッカーにとって、これは常に対処しなければならないこの1つの小さな煩わしさでしょうか?

それとも、遅かれ早かれこの構文の欠如に慣れるのでしょうか?

いずれにせよ、特に長い目で見れば、読みやすさのためにブレークラインを追加すること(Cの同等のものを追加しないことがほとんどです)は良い考えですか?他の提案は大歓迎です。


1
emacsなどのLisp対応環境でLispを使用してみましたか?他の方法では触れません。
David Thornley、2011

いいえ、できません。どのような形でLispエクスペリエンスを向上させることができますか?
vemv 2011

短い関数を書くことも非常に重要ですが、私はclojureで遊んだこともあります。
Kevin

3
優れたLisp環境では、括弧を無視して、インデントで構造を読み取ります。お気づきのように、括弧を数えることで構造を読むのは本当に、本当に面倒です。
David Thornley、2011

回答:


8

どのように解析しますか

if (a > b && foo(param)) {
  doSomething();
} else {
  doSomethingElse();
}

解析ツリーはおそらく次のようになります

if:
  condition:
    and:
      lt:
        left: a
        right: b
      function:
        name: foo
        param: param
  true-block:
    function:
      name: doSomething
  false-block:
    function:
      name: doSomethingElse

うーん...このツリーをリストにシリアル化しましょう、プレフィックス表記

if(and(<(a, b), function(foo, param)), function(doSomething), function(doSomethingElse))

この解析ツリー形式は操作が非常に簡単ですが、問題が1つあります。セパレーターが嫌いです。ターミネーターが好きです。同時に、空白をふりかけるのも好きです。

if( and (<(a b) function(foo param)) function (doSomething) function ( doSomethingElse))

うーん...追加の空白文字は特定の事柄を解析するのを難しくします...多分私は木が(ルートリーフリーフリーフ)として表されるというルールを作ることができたでしょう。

(if (and (< a b) (function foo param)) (function doSomething) (function doSomethineElse)

現在、パースツリーのシリアル化 lispです(関数の名前を変更して適用すると、おそらくこれが実行されます)。プログラムを作成するプログラムが必要な場合は、構文解析ツリーを操作するだけでいいです。

これはs-expressionsがどのようにして生まれたのかというわけではありませんが、早期に特定されたものであり、lispプログラマーが使用する機能の1つです。私たちのプログラムはある意味で事前に解析されており、プログラムを操作するためのプログラムの作成は、その形式のおかげでかなり簡単です。そのため、構文がないことが強みと見なされることがあります。

しかし、Davidが言ったように、s-expression対応のエディターを使用してください。xmlの閉じ中かっこよりも、s式の閉じ中かっこを見失う可能性が高くなり</foo>ます(<foo>close のみですが、右かっこはすべてのs式を閉じます)。ラケットでは、いくつかの式に角かっこを使用すると、適切なインデントスタイルと相まって、ほとんどの問題が修正されます。

LISPバージョン:

(if (and (< a b) (foo param))
  (doSomething)
  (doSomethingElse))

悪くない。


リストはexprs +ステートメントよりも用途が広く強力です。Emacs(または他に何か)を試してみるのは魅力的ですが、最近試してみたときは、とても怖かっただけです。sexp認識は正確に何をもたらしますか?
vemv 2011

単純なもの:閉じた括弧と開いた括弧でハイライトをバウンスします(またはS式全体を異なる方法でハイライトします)。彼らは素晴らしいインデント規則を持っています。Emacsには他にもありますが、読みやすさにとってそれほど重要ではないでしょう。他にもs-expressionに対応したエディターがあります。emacs は必要ありません。emacsがあなたを怖がらせている場合は、テキストメイトや崇高なものなどのバンドルを試してください。エディターが読みやすさを支援し始めると、物事は少し簡単になります。私はラケットでほとんどのリッシーなものをします、それは括弧が使用されることができるどこでも角括弧を可能にします。スイッチアップできることは読みやすさを助けます。
ccoakley

1
余談ですが、ネストされたlet、defineなどを使用して、それらを小さな部分に分割します。チャンクの適切な名前が思いつかない場合は、それをデザインに関する警告として扱います。小さすぎる名前と読みすぎる大きさのバランスを見つけてください。
ccoakley

ああ、最後のアドバイスは...記憶に残る:)私がこれを書いているときにSublimeを試してみてください。
vemv 2011

5

どのようなS式について本当にうれしいですが、時間の短い期間の後、あなたは、もはやそれを見ていないということです、それはあなたの目にpythonのようなものだしかし、コンピュータは、まだ簡単にツリーを持っています。

  • したがって、インデントは自動的に行われ、あいまいさはありません。ブロックを終了するときに、Tabキーを2回押すなどの必要はありません。

  • ランダムなコードを選択すると、お気に入りのエディターから1つのコマンドを実行するだけで、全体が簡単にインデントされます

  • あなたはあなたのコードをナビゲートすることができ、本当に良いエディタでそれらを交換し、その上、簡単にS-EXPとの間にジャンプ

さらに、操作しているデータは作成しているコードと同じであるため、同じ言語を使用してコードを正しく操作できますか?

まあ、それができます。それがマクロと同じです。他のリストと同じように評価される前に、作成しているコードを操作します。そのため、Lispは「プログラム可能なプログラミング言語」であると言われています。あなたはあなたのためにあなたのコードを書くコードを書く。

ここでのLispの性質を説明し、彼らはXMLを見ると、なぜLispのプログラマは笑っ素晴らしい記事です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.