challenge 変数の初期値

WEB+DB 43のRecent Perl Worldを読んで知りました。

変数を初期化するに当たってPerlでは
my $var ||= 'foo';
とかきます。この不備を補うためPerlの5.10には
Defined-or演算子が実装されたそうです。
$zero //= 25;
このような変数のデフォルト設定を行う方法を各種言語ではどうかくのでしょうか。


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は良く知らないので外しているかもしれませんが…。

確かに、用途を考えてみるとそちらの方が近いような気がしますね。

お題への答えとしては引数リストの 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
|#

Index

Feed

Other

Link

Pathtraq

loading...