続きです Scheme R7RSの形式意味論を見て行きます。 前回の続きとなります。 Scheme R7RSの形式意味論を読んでいく3 - nptclのブログ 【new】newの実装を考える これ以降はnew関数が現れるため、メモリに関する説明が必要です。 newは新たにメモリ領域を確保…
続きです Scheme R7RSの形式意味論を見て行きます。 前回の続きとなります。 Scheme R7RSの形式意味論を読んでいく2 - nptclのブログ 7.2.3. Semantic functions 意味関数はSchemeの中核です。 式を受け取りどのように実行するかを表します。 意味関数は次の…
続きです Scheme R7RSの形式意味論を見て行きます。 前回の続きとなります。 Scheme R7RSの形式意味論を読んでいく1 - nptclのブログ 形式意味論の関数 話しを続ける前に、形式意味論でよく使われる「関数」について 説明しておく必要があります。 関数とい…
はじめに Schemeの仕様書を見ていました。 ものはここにあります。 small.r7rs.org https://small.r7rs.org/ さらに日本語訳もいくつかあるようです。 私はここを利用させていただきました。 R7RS 日本語訳 (milkpot様) http://milkpot.sakura.ne.jp/schem…
nptに色を付けてみました。 気分転換です。 なんかいいですね。 ただ色が付いただけでわくわくします。 本当は色はおまけでした。 そのうちeditline / readlineを廃止しようと思っており、 代わりとなるプロンプトモジュールを作成していたのですが、 せっか…
目次 はじめに 使い方 evalの場合 compile-fileの場合 make-load-formの実行 gensymを扱う makefileを使う 1. はじめに load-time-valueという機能を知っていますか? この機能の実装が死ぬほど面倒だったので、 ちゃんと記録に残そうという気持ちになりまし…
clispを使いたいなら、あまり難しいことを考えずに pkgとかportsを利用すればいいと思います。 ここでは、手動でclispを構築する方法について説明します。 以前にも同じ内容clispをFreeBSDにインストールする - nptclのブログを投稿しましたが、 13.0-RELEAS…
Common Lispにはオブジェクト指向のシステムが存在します。 通称、CLOS (Common Lisp Object System)です。 本章は、不完全な知識でCLOSを開発していくことを考えます。 Common Lispでは、CLOSはオプションではなく必須の機能です。 特にエラーで使用します…
開発のメモです。 npt amalgamationとは、sqliteのamalgamationの考え方をまねて作ったものであり、 nptのソースを1つのファイルに結合するというものです。 現時点でnptのソースは770個くらいですが、amalgamationを使えば lisp.c lisp.h shell.c の3つにな…
Prologを使いたいのですがどうしたらいいのか。 ちょっと調べてみると、Common Lispで動作するPrologがあるらしく、 有名どころではPAIPROLOGというものがありました。 これはPAIPという有名な本に載っていたものなんだと思います。 自分は見たことが無いの…
nptでstring-streamのbyteバージョンを作りました。 Common Lispでは、文字列をストリームに対応させた input-stream, output-streamというものが存在しますが、 characterではなく(unsigned-byte 8)に対応したという話です。 あらかじめ言っておくと、npt以…
あまり考えたことが無かったのですけど、 Unicodeに対応している処理系だと、 symbolに日本語が使えます。 次のコードを例に挙げます。 (defun 何回か乗算する (回数 値) (let ((答え 1)) (dotimes (無視 回数 答え) (setq 答え (* 答え 値))))) (何回か乗算…
前回の投稿で登場したprompt-forに restartをつけて豪華にしてみましょう。 prompt-for関数はこんな感じで紹介しました。 (defun prompt-for (type prompt &optional (stream *query-io*)) (finish-output stream) (format stream "~&~A" prompt) (finish-ou…
restartとは何か? ずっとよく分かっていませんでした。 でもCommon Lispを作って行けばおのずと理解できると思って、 一通り作っても依然としてrestartが理解できませんでした。 invoke-restartもrestart-bindもC言語で作ったのに いまだに理解できないとは…
最近知ったのですが、lambda式はクロージャーが値を捕捉していない場合は 実行するたびにいちいち関数生成なんてしないで、 グローバルの関数を返却すればいいんだそうです。 どういうことかというと、例えば次の関数を考えてみます。 (defun aaa () (lambda…
少し前にnptを一通り完成させたと書きました。 現時点でバグは大量にあるだろうと思っていたのですが、 とりあえずConsesのテストケースを一通り実施したものの、 予想をはるかに上回り、大半がバグありという結果になりました。 ちょっとひどすぎる。 ほと…
getfはplistの値を操作するアクセス関数です。 取得する方の構文は、 (getf plist indicator &optional default) みたいな感じです。 設定の方はこんな感じ。 (setf (getf place indicator &optional default) new-value) 説明では、setfでgetfを使うときにd…
nptの使い方についてちゃんと書いていかないとなと思っていたのですが、 どうやって実現して行けばいいものやら悩んでいました。 あまりいい方法も思いつかないので、 本ブログ全体を説明書みたいにしていこうと思います。 まずnptのトップページが無いので…
下記に移動しました。 ★nptの日本語のドキュメント https://nptcl.github.io/npt-japanese/docs/npt/index.html https://nptcl.github.io/npt-japanese/md/npt/index.html https://github.com/nptcl/npt-japanese 英語版のドキュメントは今まで通り、nptにそ…
たまにはバカな投稿でもします。 今日はエイプリールフールじゃないんだぞ、ということでちゃんと開発はしますよ。 nptのソースコードを使って、あなただけのCommon Lispを作りましょう。 nptは名前が変更されることを前提として開発されています。 名前を表…
ようやくできた! やったー!! 長かった。 ひたすら長かった。 以前の投稿Npt Lispの紹介 - nptclのブログでは、 ANSI Common Lispの関数を全部実装できたら 不完全であっても強制的にv1.0.0にすると言いました。 ついにそのときがやって来ました。 今まで…
compile-file関数を実装して行ったら、 最後の最後にeval-whenにたどり着きました。 eval-whenは難しいですね。 この機能を調べても全然意味が分かりません。 何に使うものなのかを簡潔に書くことすら難しいです。 たぶん「compile-fileで、コンパイルだけで…
make-load-formなんて誰も使ってないと思いますが説明します。 いまさらですけど、Common Lispって1994年に制定されているんですよね。 25年近く前の言語でマイナーな関数の説明なんて全く需要ないっすね。 それではmake-load-formを使ってみましょう。 これ…
lexical変数の設計を色々やってみて、最終的に落ち着いたものについて話します。 たぶんこれが正解に近いのかと。 少しでも速度改善したいと、clispのdisassembleでも見てみようかと思ったときのことです。 速度測定によく使っていたmk.eastasian.lispのextr…
以前の結果はこれで、 $ time npt --script mk.eastasian.lisp real 0m57.098s user 0m56.853s sys 0m0.233s 今回の結果はこれ。 $ time npt --script mk.eastasian.lisp real 0m23.119s user 0m22.831s sys 0m0.283s 半分以上早くなっていますね。 わりとい…
前回の投稿では下記の通り、 悪い方向に26倍の速度差を叩き出しました。 ・clisp real 0m2.291s ・npt real 1m1.046s nptが遅すぎる。 これだとnptが遅すぎて使い物にならないという結論です。 しかし高速化はいくつかの案があったので、 それなりに速度差は…
早いもので一年が経過しました。 nptの開発のために立ち上げたブログですが、 思ったより進んだような気がします。 ブログを書き始めた当時なんて、絶対作れないと思ってたんですが、 あと残り3つの関数を作成できれば完成です。 ただ、ここからが長いかもし…
Happy Hacking Keyboardではありません。 Happy Hacking Keyboard Lite2でもないです。 Happy Hacking Keyboard Liteです。 いつ買ったのかもう記憶にありませんが、ずっと酷使してきました。 今ならレビューできるような気がする。 長所は下記の通り 頑丈過…
Common Lispの共有配列の話題です。 共有配列の拡張に関して、細かい所がはっきりしなかったので、 実験した内容をメモとして残します。 共有配列とは、別の配列を参照するだけの配列のことです。 make-arrayに:displaced-to引数を指定することで作成できま…
nptの開発は結構進んでおり、 あとはcompile-file, load, stepだけとなりました。 まあバグを含め問題盛りだくさんなんですけどね。 nptの開発目的の一つとして、C言語に組み込んで使うという考えがあります。 だからわざわざnpt-amalgamationという訳の分か…