私は自分にスキームを教える1日目1時間です。言うまでもなく、何もわかりません。だから私はThe Little Schemerを読んでいて、これを使用しています:
通訳として。
たとえば、'
を使用する必要があります
(atom? 'turkey)
「未定義の変数」エラーを回避するため。本によると、'
はCommon LISPのものです。
2つの質問があります。
上記の通訳はいいですか?あなたは別のものをお勧めできますか? The Little Schemerでうまくいくものが必要です。
'
とは何ですか?
フォーム 'foo
は、特別なフォームを入力するためのより速い方法です
(quote foo)
つまり、「fooという名前を評価せず、その値に置き換えます。私は本当にfooという名前を意味します」。
私は、SISCがTLSの演習を探索するのに完全に適していると思います。
Schemeの基本的な評価ルールを理解する必要があります。
最初:
(atom? 'turkey)
リストは関数アプリケーションであるため、atom?
は関数に対して評価されます。 'turkey
は(quote turkey)
の簡略表記です。 (quote turkey)
を評価すると、シンボルturkey
が得られます。
したがって、次に関数がシンボルturkey
に適用され、戻り値が計算されます。
2番目
(atom? turkey)
ここでも関数アプリケーションがあり、atom?
は関数に評価されます。今回はturkey
は変数です。 turkey
を評価すると、それにバインドされている値-それが何であるかがわかります。
したがって、関数は変数turkey
の値に適用されます。
概要
turkey
は変数であり、その値に評価されます。 'turkey
は(quote turkey)
であり、シンボルturkey
に評価されます。
Schemeはs式を再利用し、s式からそのプログラムを構築します。これはturkey
が変数である必要があり、時にはシンボルである必要があるという問題につながります。これは初心者には少し混乱します。しばらくすると、その背後にあるパワーが表示されます。
SISCは優れていますが、より軽量なオンラインScheme executorは http://codepad.org です。これは実際にはREPLインタラクティブではないという点ではありませんが、かなり近いです。送信したコードはserverブラウザアプレットを使用する代わりに、サイドを使用し、実行しているコードを短いURLで共有できます。
コードパッドの about ページには、「MzScheme v372 [cgc]」を使用していると記載されています。
あらゆる種類のクイックスニペットテストにコードパッドを使用しています(SO回答のテストコードサンプルを含む)!)。
引用構文の場合、次のようなコードを使用して違いを確認できます。
(let ((x 5))
(display x) (newline)
(display 'x) (newline))
これは表示します:
5 x
最初のケースでは、x
が評価され、display
に渡されて5が出力されます。2番目のケースでは、symbolx
(文字列と同じではありません)がdisplay
に渡され、シンボルの名前が出力されます。
_(quote ...)
_の短縮形、_'
_はコードをデータに変換します。
stuff
はシンボルです。つまり、変数の名前や関数の名前などにすることができます。
_'stuff
_は、シンボル「もの」自体を提供します。
_(dostuff "on" those 4 :parameters)
_を評価すると、4つのパラメーター(文字列、変数の内容、数、およびキーワード)で関数dostuff
が実行されます。'(dostuff "on" those 4 :parameters)
が評価されると、上記のコードが返され、評価されると、4つのパラメータを使用して関数dostuff
が実行されます。
例:_'''somecode
_を実行すると、_''somecode
_が返されます。 _''somecode
_を実行すると、_'somecode
_が返されます。 _'somecode
_を実行すると、somecode
が返されます。 somecode
を実行すると、...まあ... somecode
が実行されます。
_'
_は_(eval..)
_の反対のビットに少し似ていると言えます。
_(eval (eval (eval '''(print "hello"))))
_は「Hello」と出力します。
_(eval (eval (eval ''''(print "hello")))
_-もう1つの_'
_に注意してくださいeval
-何も出力しませんが、コード_(print "hello")
_自体を返します!!
Lispersは、返されたコード(および場合によっては手書きのコード)を「コード」ではなく「リスト」と呼ぶ傾向があることを除いて、Digを少し深く掘り下げると明らかな理由が明らかになります。幸運を :)
IDE、デバッガ、たくさんのライブラリがある PLT Scheme のようなより良い環境に移動することをお勧めします。前進してより大きなプログラムを書き始めると、それらが必要になります。
単一引用符の文字は「引用符」式の構文糖なので、 'turkeyは(quote turkey)と同じです。基本的に、「見積もり」は、Schemeエバリュエーターをオフにすることです。つまり、 "quote"は式をそのまま返します。 「引用」がない場合、Schemeは現在の環境で「七面鳥」を評価しようとします。これはCommon LISPのものではなく、LISPのものです。一般的なLISPとSchemeは、LISPの2つの方言です。 「引用」の使用法は、すべてのLISPチュートリアル/ブックで説明されています。 この質問 への回答も参照してください。
一重引用符文字は(quote foo)と言う簡単な方法です。quoteは、評価せずにfooだけを返すフォームです。
SchemeやLISPで実際に覚えておくべきことの1つは、すべてがデフォルトで評価されるということです。したがって、評価したくない場合は、これに座る方法が必要です。
何かを引用することでこれが可能になり、単一引用符で入力する必要が少なくなるため、コードが冗長になります。
最高のIDE for scheme
を探している場合は、Dr Racket
にアクセスしてください。ただし、開始時にDr Racket
の最初の行は#lang scheme
になるはずです。 Dr Racket
には、使用する言語を明示的に述べた多くの言語があります。
引数の値を渡すのではなく、引数自体を渡したい場合は、引用符を使用します。これは主に、Cプログラミング言語では利用できないリスト、ペア、アトムの使用中に渡されるプロシージャに関連しています(ほとんどの人はCプログラミングを使用してプログラミングを開始するため、混乱します)これはLISPの方言であるSchemeプログラミング言語のコードですこのコードを理解できると思います。
(define atom? ; defining a procedure atom?
(lambda (x) ; which as one argument x
(and (not (null? x)) (not(pair? x) )))) ; checks if the argument is atom or not
(atom? '(a b c)) ; since it is a list it is false #f
最後の行(atom? 'abc)は、abcをそのままプロシージャに渡して、abcがatomであるかどうかを確認しますが、(atom?abc)を渡すと、 abcの値を渡し、それに値を渡します。それ以来、値を指定していません。