2012-07-04 9 views
7

エクササイズ1.5。 Ben Bitdiddleは、彼が直面している通訳者が申請注文 評価または通常の注文評価を使用しているかどうかを判断するためのテストを発明しました。彼そして((試験XY)()= X 0(IF y)を定義する)SICPエクササイズ1.5

((p)(p)を定義する)

:彼は、次の2つの 手順を定義します評価される式

(テスト0(P))

ベンは Applicativeのオーダーの評価を使用してインタプリタで何の行動を観察するのだろうか?正常注文の評価を使用する インタプリタを使用して、どのような行動を観察しますか?

私は演習の答えを理解しています。私の質問は、どのように(p)がpと解釈されるかにある。例えば、(test 0(p))はインタプリタをハングさせる(期待される)が、上記の定義を持つ(test 0 p)はすぐに0と評価される。

また、定義を(define(p)p)に変更したとします。与えられた定義では、(test 0(p))と(test 0 p)の両方が0と評価されます。なぜこれが起こりますか?なぜ通訳はハングアップしないのですか?私はDr. RacketをSICPパッケージと共に使用しています。

答えて

15

pは関数です。 (p)は、関数への呼び出しです。

あなたの通訳では、pを評価します。

p <Return> 
==> P : #function 

(p)と評価されました。あなたの通訳者を殺す方法を知っていることを確認してください! (おそらく博士ラケットで“停止”ボタンがあります。)何も起こらないことを

(p) 

注意。少なくとも、目に見えるものはありません。通訳者は、テールコールを排除して(したがって、0メモリに近い値を使用して)、pと呼んでいます。

p(p)は異なる動作に評価されるため、異なる動作が期待されます。

第2の質問:pは、それ自身を返す関数であると定義しています。繰り返しますが、(define (p) p)p(p)を評価し、何を得るかを確認してください。私の推測(私は何もインストールすることができず、計画がないコンピュータを使用している)は、同じことを評価するということです。 ((eq? p (p))#tと評価されることもあります)

+0

+1簡潔な答えです。また、http://codepad.orgを試してみてください。 –

+0

ありがとうございます。私も答えを探しています。 – user1166240