yuu_nkjm blog


2013-11-23(Sat) [長年日記]

[Kawa][Scheme] グローバル定義の変数やローカル定義の変数をこねくりまわす

Schemeの練習.元々はset!じゃなくてdefineでやりたいんだった….

(define a "hoge")
(define b 'a)
 
(define set-in-func1! (lambda(x) 
  name: 'set-in-func1!
  (display x)     ;; a
  (set! x "pyo")  ;; x=>"pyo"
  (display x)     ;; pyo
))
(trace set-in-func1!)
(set-in-func1! b);; (set-in-func1! a)
a        ;; hoge
b        ;; a
(eval b) ;; b=>a=>"hoge"
 
(define x "hoge")
(define y 'x)
 
(define set-in-func2! (lambda(z) 
  name: 'set-in-func2!
  (display z)             ;; x
  (eval `(set! ,z "pyo")) ;; (eval (set! x "pyo"))
  (display z)             ;; x
))
 
(trace set-in-func2!)
(set-in-func2! y)  ;; y=>x  ===> (set-in-func2! x)
x  ;; "pyo"
y  ;;  x
 
(define m "hoge")
(define n "moge")
 
(define set-in-func3! (lambda(n) 
  name: 'set-in-func3!
  (display n)             ;; "hoge"
  (eval `(set! n "pyo"))  ;; (eval (set! n "pyo")) evalはレキシカルな環境の影響を受けない
  ;;(eval `(set! ,n "bar")) は,(eval (set! "foo" "bar"))となるのでエラー
  (display n)             ;; "hoge"
))
(trace set-in-func3!)
(set-in-func3! m) ;; n=>m=>"foo" ===> (set-in-func3! "foo")
m ;;hoge
n ;;pyo
 
(define x "global")
(define y 'x)
 
(define set-with-macro! (lambda ()
  name: 'set-with-macro!
  (define-macro (macroset! x msg)
     (let ((t (eval x)))
      `(set! ,t ,msg)))
  (define x "local")
  (define y 'x)
  (define set-in-func4! (lambda(z) 
    name: 'set-in-func4!
    (display x)             ;; local
    (macroset! y "change local var")
    (display x)             ;; change local var
  ))
  (set-in-func4! y)
))
 
(trace set-with-macro!)
(set-with-macro!)
x  ;; "global"
y  ;;  x

関連ページ

本日のリンク元
検索

トップ «前の日記(2013-11-22(Fri)) 最新 次の日記(2013-12-24(Tue))» 月表示 編集 設定
2006|01|06|12|
2007|06|09|
2008|01|03|04|06|07|08|09|10|12|
2009|01|02|05|06|07|08|10|11|12|
2010|03|04|05|06|07|08|09|10|11|
2011|01|02|03|04|05|06|07|08|09|11|12|
2012|01|02|04|06|07|08|10|11|12|
2013|01|02|03|07|08|10|11|12|
2014|01|02|04|05|06|07|08|09|10|11|
2015|01|02|07|11|12|
2016|01|03|05|07|08|09|