無名関数

Last-modified: 2012-10-06 (土) 13:34:30

LISP系の他の言語と同じく、SKILL言語でも無名関数を扱うことができる。

; 《例》mapcar 関数でオブジェクトの情報をリスト化する
(mapcar (lambda (o) (list o~>name o~>xy o~>orient)) (geGetSelectedSet))
; 《例》sort関数に渡す比較関数
(sort (geGetSelectedSet) (lambda (a b) (alphalessp a~>name b~>name)))

SKILL言語の変数は動的スコープであるので、SKILL言語の無名関数はクロージャー(関数閉包)ではない。変数が静的スコープ(構文スコープ)である Scheme言語 などで作られたプログラムを移植する場合には気をつけること。

(setq x "global")
(setq getX
  (let ((x "local"))
    (lambda () x)
  )
)
(apply getX nil)
→ "global" ; Scheme言語なら "local"

このコード例では、変数 getX に入っている無名関数を apply で評価した時、動的スコープ方式の SKILL 言語としては、apply が書かれた場所での変数 x の値 "global" を返す。(静的スコープ方式の Scheme 言語であれば、(lambda () x) が書かれた場所での変数 x の値 "local" を返す。)