Lisp / Scheme の ' (アポストロフィ) とは何ですか?
-
20-09-2019 - |
質問
私はスキームを独学で勉強して1時間1日目です。言うまでもなく、何もわかりません。だから私は読んでいます 小さな策士 そしてこれを使って:
通訳として。
使う必要がある '
たとえば
(atom? 'turkey)
「未定義変数」エラーを回避するため。の '
, この本によると、これは Common Lisp のものです。
質問が 2 つあります。
上で述べた通訳は良い通訳ですか?他にお勧めできますか?相性の良いものが必要です 小さな策士.
とは
'
?
解決
フォーム'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は良いですが、もっと軽量なオンラインスキームエグゼキュータは http://codepad.org のです。それは、対話型ではないということで、実際にREPLではないのですが、それはかなり近いです。あなたが提出したコードではなく、ブラウザのアプレットを使用してののサーバーの側で実行されます。そして、あなたはあなたが短いURLで実行しているコードを共有することができます。
codepadにのページについてはは、それが "MzSchemeののv372 [CGC]" を使用していますと言います。
私は(SO答えをテストするコードサンプルを含む!)迅速なスニペットテストのすべての種類のcodepadを使用します。
引用構文については、違いは、このようなコードを使用して見ることができます:
(let ((x 5))
(display x) (newline)
(display 'x) (newline))
このディスプレイます:
5 x
最初のケースでは、x
が第2のケースで5を印刷した、display
と評価と渡され、(文字列と同じものではない)のシンボル x
が渡されシンボルの名前をプリントした、display
します。
(quote ...)
の略記は、'
データにコードを回します。
stuff
がシンボルである、それはそれは、など。
関数の変数や名前の名前であることを意味し
'stuff
はあなたのシンボル「もの」自体を与えます。
(dostuff "on" those 4 :parameters)
評価されたときに、四つのパラメータを持つ関数のdostuff
を実行します:文字列、変数の内容、それらの、番号とキーワード
評価さ'(dostuff "on" those 4 :parameters)
は、上記..
dostuff
をコードを返します
例:
'''somecode
を実行し、それが''somecode
を返します。 ''somecode
を実行し、それが'somecode
を返します。 'somecode
を実行し、それがsomecode
を返します。 ...よくsomecode
が実行されます... somecode
を実行し、かつます。
あなたは'
ビット(eval..)
の反対のようであると言うことができます。
(eval (eval (eval '''(print "hello"))))
は
。 "こんにちは" を印刷します
(eval (eval (eval ''''(print "hello")))
- その後、'
を1以上eval
に気づく - !!何も印刷されないだろうが、それは、コード(print "hello")
自体を返します。
lispersはそれを呼び出すために傾向があることを除き、あなたは少しだけ深く掘ると明らかに出血される理由のため、代わりに「コード」のコード(時には手書きのコード)「リスト」を返しました。幸運:)
より良い環境に移ることをお勧めします PLTスキーム, 、IDE、デバッガ、および多くのライブラリが含まれています。さらに進んで、より大きなプログラムを書き始めると、それらが必要になります。
一重引用符文字は「quote」式の糖衣構文であるため、'turkey は (quote turkey) と同じです。基本的に、「quote」が行うことは、Scheme エバリュエーターをオフにすることです。つまり、「quote」は式をそのまま返します。「quote」がない場合、Scheme は現在の環境で「turkey」を評価しようとします。これは Common Lisp のものではなく、Lisp のものです。Common Lisp と Scheme は Lisp の 2 つの方言です。「quote」の使用法は、すべての Lisp チュートリアル/書籍で説明されています。への回答も参照してください この質問.
単一引用符は、引用符がそれを評価せずにfooのみを返す形である(引用FOOを)言うの簡単な方法です。
本当にそのことについてスキームまたは任意のLispで覚えておくべきことの一つは、すべてがデフォルトによって評価されていることです。だから、あなたは評価したくない場合には、これを座ってする方法が必要になります。
ちょうどこの単一引用符だけの少ない入力を必要とし、より少ない冗長コードにつながるされない何かを引用ます。
scheme
のための最高のIDEを探している場合は、、その後Dr Racket
のために行きます。しかし、スタートDr Racket
#lang scheme
以来Dr Racket
しなければならない最初の行は、我々は明示的に我々が使用しようとしているどの言語に言及している多くの言語を持っています。
私たちは引用符を使用して、引数の値を渡すのではなく、引数そのものを渡したいとき。これはLispの方言であるSchemeのプログラミング言語のコードです(ほとんどの人は、我々は混乱したがって、Cプログラミングを使用してプログラミングを開始)Cプログラミング言語では利用できませんリスト、ペアと原子を使用した時の手続きの通過に主に関連していますそして、私はあなたがこのコードを理解できると思います。
(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
は、そのまま最後の行(原子?「ABC)は、ABCは原子であるかどうかどうかを確認する手順にABCを通過しているが、あなたは(原子?ABC)を通過するとき、それはABCとpasssesの値をチェックしますそれに値。 、我々はそれに任意の値を提供していないので、