2012-03-27 8 views
1
#lang eopl 

(define-datatype env env? 
    (empty-env) 
    (extended-env (var symbol?) 
       (val scheme-val?) 
       (envi env?))) 

(define (scheme-val? x) #t) 

; examples 
(define e-env (empty-env)) 
(define e1 (extended-env 'x 1 (extended-env 'y #f e-env))) 

scheme-val?の使用方法がわかりません。なぜxがありますか?#tはなぜ返されますか? 環境変数を値に関連付ける関数です。このスキームは何をしますか?

この例では、x = 1y = #fが関連付けられています。

ありがとうございました。

答えて

1

スキームでは、#tは真を意味し、#fはfalseです。私は残りの部分を完全に理解していませんが、DrRacketのデバッガに何が起こっているかを見ることをお勧めします。

(define e-env (empty-env)) 

empty-env

(define (scheme-val? x) #t) 

ことがe-envを割り当てるパラメータxを取る匿名関数を定義し、それは(この場合、何か)scheme-valであれば、#tを返します。

e1の結果、このコードは実行後:

#(struct:extended-env x 1 #(struct:extended-env y #f #(struct:empty-env))) 

のでe1は(私が思う)

+0

ありがとうございました。述語 'scheme-val'は' x'をとりますが、 'env'では' var scheme-val? 'という形式で書かれていますので、 'define-datatype'を打つと推測しています。述語のパラメータとしての述語の左側の変数。あれは正しいですか? – CppLearner

+0

'define-datatype'と' define'を混同しないでください。 'env'定義、​​特に' extended-env'定義では、 'val'は' scheme-val'です。この 'scheme-val? '操作は'(define(scheme-val?x)#t) '関数によって定義され、' x'パラメータに対して真を返します。それは単なる構文です。 – prelic

+0

ありがとうございます。しかし、 'val scheme-val? 'と書くとき、パラメータxはどこにありますか? 'val'は' scheme-val'に渡されますか?つまり、schemeインタプリタは、これが 'datatype'なので、左辺の変数がパラメータとして渡されることに気付くのは賢明ですか?私はこれが私の質問を明確にすることを望む。ありがとう。 – CppLearner

3

scheme-val?は(真)#tを返すことになっています機能ですextended-env with var='x, val=1, envi=(extended-env with var='y, val=#f, envi=e-env)

ですそれに渡された値がその型(この場合は "scheme-val")である場合。 symbol?がシンボルに対してtrueを返し、他のすべてに対してfalseを返すように、scheme-val?はscheme-valであるオブジェクトに対してtrueを返します。

この場合、scheme-val?はすべてについて真を返します。したがって、すべてがスキームvalです。述語が単一の引数を取る必要があるので、xが存在します。それは単に引数を無視してすべての場合には#tを返します。 (env?が述語である、envが値である)

あなたがdefine-datatypeに気付くでしょうので、それはこの場合に重要だが、それが値を取り、述語はその種類を確認します。

明らかにextended-envにも同様の句があります。ここでは、varのうち、symbol?,valであり、scheme-val?envであり、env?である。

+0

とても素敵です:)ありがとうございます。 「すべてを真実に戻す」部分は本当に役に立ちます。ありがとう! – CppLearner

関連する問題