66

私は自分自身でスキームを教え始めて 1 時間 1 日目です。言うまでもなく、私は何も理解していません。だから私はThe Little Schemerを読んでいて、このことを使っています:

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

通訳として。

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

(atom? 'turkey)

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

2 つの質問があります。

  1. 上記の通訳者は良い通訳者ですか?他にお勧めできますか?The Little Schemerと相性の良いものが必要です。

  2. とは'?

4

7 に答える 7

63

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

(quote foo)

つまり、「名前 をその値に置き換えて評価しないでください。私は本当に名前自体を意味します」.foofoo

SISC は、TLS の演習を探索するのにまったく問題ないと思います。

于 2009-10-08T17:02:39.627 に答える
29

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

最初

(atom? 'turkey)

リストは関数アプリケーションなので、atom?関数に評価されます。 'turkeyの略記です(quote turkey)。評価(quote turkey)すると記号 が得られますturkey

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

2番

(atom? turkey)

ここでも関数アプリケーションがあり、関数atom?に評価されます。今回turkeyは変数です。評価turkeyすると、それにバインドされている値が得られます-それが何であれ。

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

概要

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

Scheme は s 式を再利用し、s 式からプログラムを構築します。turkeyこれは、ある時は変数でなければならず、ある時はシンボルでなければならないという問題につながり ます。これは、初心者にとっては少し混乱します。しばらくすると、その背後にある力が見えてきます。

于 2009-10-08T20:06:01.817 に答える
15

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

codepadのaboutページには、「MzScheme v372 [cgc]」を使用していると書かれています。

私はあらゆる種類のクイック スニペット テスト (SO 回答のコード サンプルのテストを含む) に codepad を使用します。

引用構文については、次のようなコードを使用して違いを確認できます。

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

これは次のように表示されます。

5
バツ

最初のケースでは、xが評価されて に渡されdisplay、5 が出力されます。2 番目のケースでは、シンボル x(文字列と同じではない) が に渡されdisplay、シンボルの名前が出力されます。

于 2009-10-08T18:25:40.163 に答える
11

の省略形で(quote ...)'コードをデータに変換します。

stuffはシンボルです。つまり、変数の名前または関数の名前などにすることができます。
'stuffシンボル「もの」自体を提供します。

(dostuff "on" those 4 :parameters) 評価されると、dostuff文字列、変数の内容、数値、キーワードの 4 つのパラメーターを使用して関数が実行されます。
'(dostuff "on" those 4 :parameters)評価されると上記のコードが返され、評価されると、dostuffその 4 つのパラメーターを使用して関数が実行されます。

例: Run '''somecode、 を返します''somecode。実行''somecodeすると戻ります'somecode。実行'somecodeすると戻りますsomecode。実行somecodeして...まあ...somecode実行します。

'の反対に少し似ていると言えます(eval..)

(eval (eval (eval '''(print "hello"))))「こんにちは」を出力します。
(eval (eval (eval ''''(print "hello")))- もう1つ注意してください'-eval何も出力しませんが、コード(print "hello")自体を返します!!

ただし、リスパーは返されたコード (場合によっては手書きのコードも) を "コード" ではなく "リスト" と呼ぶ傾向があります。幸運を :)

于 2014-12-06T13:46:32.537 に答える
5

一重引用符は(quote foo)の省略形です。ここで、quoteは、評価せずにfooだけを返す形式です。

そのことに関してSchemeやLispで本当に覚えておくべきことの1つは、すべてがデフォルトで評価されるということです。したがって、評価したくない場合は、これを受け入れる方法が必要です。

何かを引用することはまさにこれを行い、単一引用符は入力が少なくて済み、冗長なコードが少なくなります。

于 2009-10-13T12:42:47.447 に答える
4
  1. IDE、デバッガー、および多数のライブラリーを備えたPLTSchemeのようなより良い環境に移行することをお勧めします。あなたが前進してより大きなプログラムを書き始めるとき、あなたはそれらを必要とするでしょう。

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

于 2009-10-09T03:24:54.343 に答える