#:g1: (if (if ...

Posted 2021-06-06 20:48:53 GMT

なんとなく古いコードを眺めていて、ifの述語部にifが出てくるのを発見。
最近のコードにはあまり見掛けない気がするのですが、値を返すプログラミングスタイル(昔は適用型言語とも呼ばれた)らしいといえば、らしいので、どれくらい使われているのかざっと古いコードを検索してみました。
古いコードでは10万行中20〜30例位の頻度のようです。

具体的にどんなものがあるかというと、下記はNILのデバッガコマンドのコード中のもので、Zippy the Pinheadからの引用を表示するyowという謎コマンドですが(何故デバッガの機能として存在するのか)、 コマンド引数がnilなら、ランダムに引用し、引数で引用の番号が指定されているならば、範囲内かどうか調べ、表示するかエラーとするか、というものです。

(defun com-yow (arg &aux (n (simple-vector-length *yow*)))
  "Prints a Zippy the Pinhead quotation.
With no argument, one is selected at random;  with an argument, selects
that numbered one."
  (if (if (null arg) (setq arg (random n *yow-rs*)) (< -1 arg n))
      (dfmt "~&~A~%" (svref *yow* arg))
    (dfmt "  Out of range -- I know about ~D quotations.~%" n)))

類似の例としては、(if (or (and A B) ...や、(if (cond ...がありますが、(if (or (and A B) ...あたりは、たまに出来ちゃっていることもあるようなないような。

結構慣れないとぱっと思い付いて書くこともできなさそうですが機会があれば使っていきたいですね。


HTML generated by 3bmd in LispWorks 7.0.0

comments powered by Disqus