6

私はScheme/Racketの新入生ですので、露骨な構文エラーは許してください。

今日のクラスでは、スキームリスト'(a, b, c)が無効である必要があることがわかりましたが、実行すると、次のように返されました。

>'(a . b . c)  
(b a c)

これは意味がありません。Afaik、インタプリタは車'aとcdr'bでconsセルを作成する必要があり、'cは無効である必要があります。とはいえ、通訳はここで本当に奇妙なことをしています。これは、#langスキーム、#langラケットなどで機能します。インタプリタとしてDrRacketを使用しています。

興味深いことに、

>'(a . b . c . d)

例外をスローして死にます。

私は非常に興味があり、言語に慣れていないので、これを理解できるようになりたいと思っています。グーグルは非常に役に立たなかった(おそらく検索用語があいまいなため)ありがとう!

編集:それは'(a . b . c)、bを中置演算子として解釈されるためである可能性があります。例:>(4 . + . 6)10を返します。おそらくインタプリタは演算子のようにbを使用していますか?つまり、中置的に(b a c)(+ 4 6)

実験によると:

>(define b +)  
>(define a 4)  
>(define c 6)  
>(a . b . c)  
10

ですから、これで問題は解決したと思いますが、「。」の使い方はまだよくわかりません。この場合の演算子。私たちはこれを解決したと思いますが、これ以上の洞察をいただければ幸いです。

4

2 に答える 2

8

簡単な答え:あなたはそれを手に入れました。このラケット固有のドットの使用の詳細については、ラケットのドキュメントにある中置のドキュメントを参照してください 。

于 2011-09-16T20:32:04.987 に答える
4

これは、ラケットのリーダーの特別な機能です。(ジョンの答えを参照してください。)

他の実装では、代わりに読み取り可能なS式リーダーを使用して中置式を読み取ることができます。中括弧を使用します。たとえば、{3 + 4}として読み込まれ(+ 3 4)ます。さらに特別な(Racketのインフィックスリーダーよりも)、{3 + 4 + 5}または{3 + 4 + 5 + 6};を使用できます。(+ 3 4 5)それらはそれぞれととして読み取られ(+ 3 4 5 6)ます。

于 2011-09-16T20:42:10.130 に答える