結城浩のSICP日記 RSSフィード

2006-05-27

defineとeval defineとeval - 結城浩のSICP日記 を含むブックマーク

hello
;=> *** ERROR: unbound variable: hello

(eval '(define hello "Hello!") (interaction-environment))

hello
;=> Hello!

ふむふむ。

では、これをふまえて、いろいろ実験。

(define (define-symbol-with-string s)
        (eval `(define ,(string->symbol s) ,s) (interaction-environment)))

(define-symbol-with-string "yahoo")
yahoo
;=> yahoo

(define-symbol-with-string "hello")
hello
;=> hello

(map define-symbol-with-string
        (string-split "good,nice,great" ","))

good
;=> good

nice
;=> nice

great
;=> great

はじめて`と,を使ってみましたが、これでいいんでしょうか。

追記:SaitoAtsushiさんから「interaction-environmentは関数です」というご指摘が。(^_^; interaction-environment→(interaction-environment)に修正しました。ご指摘ありがとうございます。

listとeval listとeval - 結城浩のSICP日記 を含むブックマーク

気になることがあったので試す。

(list 1 2 3) ;=> (1 2 3)
(list list 1 2 3) ;=> (#<subr list> 1 2 3)

(define x (list list 1 2 3))
(eval x interaction-environment) ;=> (1 2 3)

(define y (list 'list 1 2 3))
(eval y interaction-environment) ;=> (1 2 3)

(define z (list ''list 1 2 3))
(eval z interaction-environment) ;=> *** ERROR: invalid application: (list 1 2 3)

SaitoAtsushiSaitoAtsushi2006/05/27 13:50interaction-environmentは関数です。
evalはinteraction-environmentの評価結果を必要とします。
つまり、(eval '(define hello "Hello!") (interaction-environment))としないといけないようです。
でも、とりあえずGaucheでは何を与えてもエラーにはならないっぽいですね。

トラックバック - http://sicp.g.hatena.ne.jp/hyuki/20060527