2009-10-08 29 views
49

私は自分のスキームを教える1時間1日目です。言うまでもなく、私は何も理解していません。だから私はリトルスキーマーを読み、この事を使用しています:Lisp/Schemeで '(アポストロフィ)とは何ですか?

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

を通訳として。

私は「未定義の変数」のエラーを回避するために、例えば中

(atom? 'turkey) 

'を使用する必要があります。この本によると、'はCommon Lispのものです。

私は2つの質問があります。

  1. は、私は良い1上記のインタープリタですか?別のものをお勧めできますか?私はリトル・スキーマとうまくいくものが必要です。

  2. 'とは何ですか?

+1

"私は '未定義の変数'のエラーを避けるために必要です - あなたがこのように書くなら、あなたのアプローチについて深刻な欠陥がありますが、私は何も言えません。以前のR4RS標準(R5RSまたはR6RSよりアクセスが容易)を注意深く読んでください。 –

答えて

47

フォーム'fooは、単純にfooという名前を評価し、その値とそれを置き換えるものではありません」、と言うことです特殊な形

(quote foo) 

を入力するためのより高速な方法であり、私は本当に意味名前foo "。

私はSISCがTLSのエクササイズを探求するのにまったく問題ないと思います。

+0

見積もりと機能の間に機能的な違いはありませんか?すなわち、暖房/冷房のルール。 fooが関数に渡されると、最初に評価されますが、引用符のポイントは評価を保持することです。 –

13

SISCは優れていますが、さらに軽量のオンラインスキームエグゼキュータはhttp://codepad.orgです。インタラクティブではないという点で実際にREPLではありませんが、かなり近いです。提出したコードは、ブラウザアプレットを使用する代わりにサーバー側で実行されます。また、短いURLで実行しているコードを共有することもできます。

codepadのaboutページには「MzScheme v372 [cgc]」が使用されています。

私はすべての種類のクイックスニペットテスト(SO回答のコードサンプルのテストを含む)には、コードパッドを使用します。

(let ((x 5)) 
    (display x) (newline) 
    (display 'x) (newline)) 

このディスプレイ:

引用構文の

、差がこのようなコードを使用して見ることができる最初のケースで

 
5 
x 

xが評価され、displayに渡されます2番目のケースでは、シンボルx(文字列と同じではありません)がdisplayに渡されます。これは、名前oを出力しますfシンボル。

22

Schemeの基本的な評価ルールを理解する必要があります。

まず

(atom? 'turkey) 

リストは、関数適用であるので、atom?は、関数に評価されます。 'turkeyは、(quote turkey)の簡略表記です。 (quote turkey)を評価すると、記号turkeyが得られます。

次に、シンボルturkeyに関数が適用され、戻り値が計算されます。

(atom? turkey) 

セカンド

は再び我々は、機能のアプリケーションを持っているとatom?は、関数に評価されます。今回はturkeyが変数です。 turkeyを評価すると、それに結びついている価値が得られます。

したがって、関数は変数turkeyの値に適用されます。

概要

turkeyその値に評価されます変数です。 'turkey(quote turkey)で、シンボルturkeyと評価されます。

スキームは、s式を再使用し、そのプログラムをs式からビルドします。これはいつかはturkeyが変数でなければならないという問題につながり、時には記号でなければならないことがあります。これは初心者のために少し混乱しています。しばらくすると、後ろの力が見えます。

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

  2. 一重引用符は「引用」式の構文砂糖です。したがって、「七面鳥は七面鳥と同じです。基本的に、「見積もり」は、スキーム・エバリュエーターをオフにすることです。言い換えれば、 "quote"は逐語式を返します。 "引用"がなければ、Schemeは現在の環境で "七面鳥"を評価しようとします。これはCommon Lispのことではなく、Lispのことです。 Common LispとSchemeは、Lispの2つの方言です。 "quote"の使用法はすべてのLispチュートリアル/書籍で説明されています。 this questionの回答もご覧ください。

3

一重引用符文字は、(引用符foo)と言っている簡潔な表現です。ここでquoteは評価なしでfooを返す形式です。

SchemeやLispで実際に覚えておかなければならないことは、すべてがデフォルトで評価されることです。したがって、あなたが評価したくない場合には、これを座る方法が必要です。

何かを引用するだけで、一重引用符で入力する必要が少なくなり、冗長なコードが少なくなります。

+0

Emm、デフォルトではすべてが評価されるわけではありません。 '(t(1)(2)ならば)'では、(2)は決して評価されません。すべては、デフォルトではトップレベルまたは関数のパラメータでのみ評価されます。 *他の場所*の場合は、他の場所*がどこにあるかに応じて評価される場合と評価されない場合があります。 – enrey

1

schemeの最適なIDEをお探しの場合はDr Racketにお進みください。しかし、Dr Racket の最初の行は、Dr Racketに多くの言語があるので、どの言語を使用するかを明示しているので、#lang schemeにする必要があります。

引数の値を渡す代わりに引数自体を渡したい場合は、quoteを使用します。これは主に、Cプログラミング言語では利用できないリスト、ペア、アトムの使用中に渡される手続きに関連しています(ほとんどの人がCプログラミングを使用してプログラミングを始めるので、混乱します)。これはLispの方言私はあなたがこのコードを理解できると思います。

(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の値を渡して値を渡します。以来、我々はそれに価値を提供していません

3

の略語(quote ...)のために、'はコードをデータに変換します。

stuff

'stuff
はあなたにシンボル「もの」自体を与える...それはそれは、変数や関数の名前、などの名前であることを意味し、記号です。

(dostuff "on" those 4 :parameters)評価すると、関数dostuffは、文字列、変数の内容、数値、キーワードの4つのパラメータで実行されます。
'(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")が返されます。

リスペースは、「コード」ではなく「返されたコード」(場合によっては手書きコード)の「リスト」を呼び出す傾向があります。幸運:)

+0

いいえ、スキーム(common lispとは対照的に)では、stuffは識別子です。それは、「もの」のようにそれを引用することによってシンボルになります。小さな点ですが、それを正しくするのは良いことです。スキームでは、共通のlispのように、識別子をシンボルとして実装する必要はありません。最新のスキーム基準については、r7rsの§2.1と§6.5を参照してください。 –

関連する問題