変数の初期値
Posted feedbacks - Common Lisp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | お題と同じ主旨ということであれば、Common LispというかLISP系では、
orを使うのがイディオムっぽいですが、下記の例では、既にvarに
値が設定されていないとエラーになってしまいます。
;(setq var nil)
;etc 〜
(let ((var (or var 'foo)))
var)
;=> foo
大域変数については、defvarがあり、既に値が設定されている場合は、
値が上書きされません。
;; 初回
(defvar foo 'foo)
=> foo
;; 以降
(defvar foo 'bar)
=> foo
|
すいません、defvarの返り値は、変数名になるのですが、
前の書き方だと混乱を招くので、書き直しました。
前の書き方だと混乱を招くので、書き直しました。
1 2 3 4 5 6 7 8 9 10 11 | ;; 初回
(defvar var 'foo)
var
;=> foo
;; 以降
(defvar var 'bar)
var
;=> foo
|
自分もboundpもありかと思ったのですが、
シンボルの値となると、また別の話になってくる
かと思いorを使った例を書きました。
Perlは良く知らないので外しているかもしれませんが…。
シンボルの値となると、また別の話になってくる
かと思いorを使った例を書きました。
Perlは良く知らないので外しているかもしれませんが…。
確かに、用途を考えてみるとそちらの方が近いような気がしますね。
お題への答えとしては引数リストの initform, svar もアリかも。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | (defun foo (&optional (var "foo")) (if var (write var)))
(defun bar (&optional (var nil sv)) (if sv (write var)))
(dolist (form '((foo) (foo "foobar") (foo nil)
(bar) (bar "foobar") (bar nil)))
(format t "~&~S prints: " form)
(eval form))
#|
実行結果:
(FOO) prints: "foo"
(FOO "foobar") prints: "foobar"
(FOO NIL) prints:
(BAR) prints:
(BAR "foobar") prints: "foobar"
(BAR NIL) prints: NIL
|#
|




takuya_1st
#5927()
Rating-4/12=-0.33
[ reply ]