#:g1: condのelse節色々

Posted 2021-04-03 23:05:30 GMT

Schemeのcondのelse節はelseを書きますが、古典的なLispでは、condのelse節ではTを書きます。

;; Scheme
(cond (...)
      (else ...))

;; Common Lisp (cond (...) (T ...))

このTは半ば慣用句で真値となるものであれば何でも良いのですが、最近古い文献を眺めていて妙なものをみつけたのでまとめてみます。

1 と書く

(cond (...)
      (1 ...))

LISP 1の頃には、nilが0で、Tが1だったりして、M式にもTの代りに直接1が書いてあったりします。
LISP 1のM式をS式に変換した例などで稀ですが見掛けることがあります。

'T と書く

(cond (...)
      ('T ...))

Tquoteが付いているのですが、何故付いているのかは謎。
LISP 1.5のM式では大文字はクォートされたシンボルを表わすのでM式のTを正確にS式に翻訳すると(quote T)となりますので、この辺りが由来かもしれません。
MACLISPのコードで良く見掛けます。

'else と書く

(cond (...)
      ('else ...))

真値であれば何でも良いので'elseというシンボルをそのまま使ったもの。
たまに古いコードで見掛けます。

稀ですが、

(cond (...)
      (:else ...))

というキーワードシンボルの場合もあり。

(cond (...)
      ("else" ...))

でも良さそうですが、個人的には目にしたことはありません。

(and)

(cond (...)
      ((and) ...))

List Techniques / Harold V. McIntosh(1963)で良く使われている書法ですが、確かに(and)Tに評価されます。
どちらかというとandよりはorな気分な気がしますが、else節を目立たせる場合には使えたりするかもしれません。

(t)

(cond (...)
      ((t) ...))

MBLISPというLisp 1.5系の古いLispのコード例等に出てくる書き方です。
(t)Tを返すような疑似関数になっています。(true)みたいなものですね。

書かない

(cond (...)
      ((progn ...)))

else節の述語部に直接実行する式を書いてしまうというパターンです。
大抵のLisp処理系では述語部から多値を返すことができないので、注意が必要ですが、1970年代あたりでは結構目にするスタイルです。

arcのifのelse節でも良く見掛けますが多値を考慮しなくて良いのと、括弧がネストしていないのが理由かもしれません。ちなみにclosureだと節が偶数でないとエラーになるのでできないようです。

まとめ

他にも微妙なバリエーションがありますが、1990年代以降はt以外のものを書く人は殆どいないようです。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus