最上位レベルのカスタマイズ

EuslispがUNIXから呼び出されるとき、*toplevel*にバインドされる 最上位関数によって実行が始められる。 この関数は、eusの中のeustopeusxの中のxtopである。 saveの3番目の引き数に独自の関数を指定することによりこの最上位 関数を変更することができる。

この最上位関数は、任意の数の引き数を受け取れるようにプログラムすべきである。 その命令行の上の引き数はそれぞれ、強制的に文字列にされ、最上位関数に渡される。 以下に示すプログラムは、最初の引き数に与えられたファイルからくり返し読み込み、 2番目の引き数のファイルに整形表示する。

(defun pprint-copy (infile outfile)
  (with-open-file (in infile)
     (with-open-file (out outfile :direction :output)
        (let ((eof (cons nil nil)) (exp))
           (while (not (eq (setq exp (read in nil eof)) eof))
              (pprint exp out))))))
(defun pprint-copy-top (&rest argv)
   (when (= (length argv) 2)
      (pprint-copy (first argv) (second argv))))

一度これらの関数をEuslispの中に定義すれば、 (save "ppcopy" "" 'pprint-copy-top)ppcopyという名のUNIXで実行 可能な命令を作る。

Solaris上のEuslispにおいて、saveがないので、 最上位評価関数はこの手法では変更できない。 代わりに、独自の最上位評価関数を定義するためにlib/eusrt.lを 修正し、*toplevel*に設定することができる。 lib/eusrt.lには、Euslispの起動時に評価される初期化手続きを 定義している。



2016-04-05