トップ «前の日記(2008-02-08 (Fri)) 最新 次の日記(2008-02-13 (Wed))» 編集

uDiary

海野秀之(うんのひでゆき)の外部記憶

Twitter (twilog) / RSS / アンテナ / ぶくま

2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|

2008-02-12 (Tue)

[Scheme] レキシカルスコープってこういうことかな

sample4.scm:

(define f
  (lambda (x y)
      (display (op x y)) (display "\n")))

(define g
  (lambda (a b)
    (define op (lambda (a b) (+ (* a a) (* b b))))
    (f a b)))

(define h
  (lambda (a b)
    (set! op (lambda (a b) (+ (* a a) (* b b))))
    (f a b)))

(define op +)
(f 2 3)

(define op *)
(f 2 3)

(g 2 3)
(h 2 3)

実行例:

% ./iscm0 < sample4.scm
5
6
6
13

g の中で define した変数は f からは見えない。

% gosh sample4.scm
5
6
6
13

ほっ。

ちなみに、このサンプルコードを動かすためには、バグをちこっと直す必要があった。

(define op +) じゃなくて (define op (lambda (x y) (+ x y))) のように書けば、 古いバージョンでも動きます(つまり、こういうバグでした)。


2006|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|08|
2010|01|02|03|05|06|07|10|11|
2011|03|08|
2012|02|04|07|08|10|
2013|01|02|03|05|06|08|11|12|
2014|01|02|05|06|07|08|09|12|
2015|01|02|03|04|
Categories 3imp | Card | Cutter | Dalvik | Euler | Football | GAE/J | Hand | Haskell | Re:View | Ruby | Scheme | TQD | Tiger | TigerBook読 | UikiTeXi | Verilog | Violin | Web | parconc | tDiary | お勉強 | エントロピー | ツン読 | | 将棋 | 政治について | | 模写してみよう | 確率論 | 設定など | 雑文 | 音声