web-dev-qa-db-ja.com

LISP / Schemeの '(アポストロフィ)とは何ですか?

私は自分にスキームを教える1日目1時間です。言うまでもなく、何もわかりません。だから私はThe Little Schemerを読んでいて、これを使用しています:

http://sisc-scheme.org/sisc-online.php

通訳として。

たとえば、'を使用する必要があります

(atom? 'turkey)

「未定義の変数」エラーを回避するため。本によると、'はCommon LISPのものです。

2つの質問があります。

  1. 上記の通訳はいいですか?あなたは別のものをお勧めできますか? The Little Schemerでうまくいくものが必要です。

  2. 'とは何ですか?

57
jjerms

フォーム 'fooは、特別なフォームを入力するためのより速い方法です

(quote foo)

つまり、「fooという名前を評価せず、その値に置き換えます。私は本当にfooという名前を意味します」。

私は、SISCがTLSの演習を探索するのに完全に適していると思います。

55

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が変数である必要があり、時にはシンボルである必要があるという問題につながります。これは初心者には少し混乱します。しばらくすると、その背後にあるパワーが表示されます。

26
Rainer Joswig

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に渡され、シンボルの名前が出力されます。

14
Greg Hewgill

_(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を少し深く掘り下げると明らかな理由が明らかになります。幸運を :)

7
enrey
  1. IDE、デバッガ、たくさんのライブラリがある PLT Scheme のようなより良い環境に移動することをお勧めします。前進してより大きなプログラムを書き始めると、それらが必要になります。

  2. 単一引用符の文字は「引用符」式の構文糖なので、 'turkeyは(quote turkey)と同じです。基本的に、「見積もり」は、Schemeエバリュエーターをオフにすることです。つまり、 "quote"は式をそのまま返します。 「引用」がない場合、Schemeは現在の環境で「七面鳥」を評価しようとします。これはCommon LISPのものではなく、LISPのものです。一般的なLISPとSchemeは、LISPの2つの方言です。 「引用」の使用法は、すべてのLISPチュートリアル/ブックで説明されています。 この質問 への回答も参照してください。

4
Vijay Mathew

一重引用符文字は(quote foo)と言う簡単な方法です。quoteは、評価せずにfooだけを返すフォームです。

SchemeやLISPで実際に覚えておくべきことの1つは、すべてがデフォルトで評価されるということです。したがって、評価したくない場合は、これに座る方法が必要です。

何かを引用することでこれが可能になり、単一引用符で入力する必要が少なくなるため、コードが冗長になります。

4
Brad Lucas

最高の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の値を渡し、それに値を渡します。それ以来、値を指定していません。

2
vardin