nptclのブログ

Common Lisp処理系nptの開発メモです。https://github.com/nptcl/npt

Common Lispのソースで日本語を使う

あまり考えたことが無かったのですけど、 Unicodeに対応している処理系だと、 symbolに日本語が使えます。

次のコードを例に挙げます。

(defun 何回か乗算する (回数 値)
  (let ((答え 1))
    (dotimes (無視 回数 答え)
      (setq 答え (* 答え 値)))))

(何回か乗算する 16 2)
-> 65536

これすごいな。
sbcl, clisp, cclでは何事も無く動作します。

nptでは最初は無理でしたが、修正してなんとか動くようにしました。
Unicodeには対応しているので少しの修正で何とかなりました。
方法は、read実行中に#x80以上の文字コードに出会ったら 強制的にsymbolにすると言うもの。

改造中にpotential numberがどうとかやった記憶がよみがえりました。
本来ならどうするべきなのか知りませんが、これでいいでしょう。

みんな大好きなlambda式はこうなります。

(defmacro ラムダ (&rest args)
  `(lambda ,@args))

(funcall
  (ラムダ () (* ★ ★ ★))
  123))
-> 1860867

リードマクロを試してみましょう。

(set-macro-character
  #\㈱
  (lambda (s c)
    (declare (ignore c))
    (format nil "株式会社~A" (read s t nil t))))

(format t "~S~%" ㈱コモンリスプ)
-> "株式会社コモンリスプ"

正直、見づらい。