nptclのブログ

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

2020-01-01から1年間の記事一覧

バイナリストリームの実装

npt

nptでstring-streamのbyteバージョンを作りました。 Common Lispでは、文字列をストリームに対応させた input-stream, output-streamというものが存在しますが、 characterではなく(unsigned-byte 8)に対応したという話です。 あらかじめ言っておくと、npt以…

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

あまり考えたことが無かったのですけど、 Unicodeに対応している処理系だと、 symbolに日本語が使えます。 次のコードを例に挙げます。 (defun 何回か乗算する (回数 値) (let ((答え 1)) (dotimes (無視 回数 答え) (setq 答え (* 答え 値))))) (何回か乗算…

prompt-forを完成させる

前回の投稿で登場したprompt-forに restartをつけて豪華にしてみましょう。 prompt-for関数はこんな感じで紹介しました。 (defun prompt-for (type prompt &optional (stream *query-io*)) (finish-output stream) (format stream "~&~A" prompt) (finish-ou…

restartを始めよう

restartとは何か? ずっとよく分かっていませんでした。 でもCommon Lispを作って行けばおのずと理解できると思って、 一通り作っても依然としてrestartが理解できませんでした。 invoke-restartもrestart-bindもC言語で作ったのに いまだに理解できないとは…

lambda式で関数生成しない場合を考える

最近知ったのですが、lambda式はクロージャーが値を捕捉していない場合は 実行するたびにいちいち関数生成なんてしないで、 グローバルの関数を返却すればいいんだそうです。 どういうことかというと、例えば次の関数を考えてみます。 (defun aaa () (lambda…

nptのバグが多すぎる

npt

少し前にnptを一通り完成させたと書きました。 現時点でバグは大量にあるだろうと思っていたのですが、 とりあえずConsesのテストケースを一通り実施したものの、 予想をはるかに上回り、大半がバグありという結果になりました。 ちょっとひどすぎる。 ほと…

(setf getf)の定義が難しかった

getfはplistの値を操作するアクセス関数です。 取得する方の構文は、 (getf plist indicator &optional default) みたいな感じです。 設定の方はこんな感じ。 (setf (getf place indicator &optional default) new-value) 説明では、setfでgetfを使うときにd…

nptついて気が済むまで書いていくことにする

npt

nptの使い方についてちゃんと書いていかないとなと思っていたのですが、 どうやって実現して行けばいいものやら悩んでいました。 あまりいい方法も思いつかないので、 本ブログ全体を説明書みたいにしていこうと思います。 まずnptのトップページが無いので…

ANSI Common Lisp 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にそ…

ANSI Common Lisp Helloの開発

npt

たまにはバカな投稿でもします。 今日はエイプリールフールじゃないんだぞ、ということでちゃんと開発はしますよ。 nptのソースコードを使って、あなただけのCommon Lispを作りましょう。 nptは名前が変更されることを前提として開発されています。 名前を表…

ANSI Common Lisp npt version 1.0.0 になりました

ようやくできた! やったー!! 長かった。 ひたすら長かった。 以前の投稿Npt Lispの紹介 - nptclのブログでは、 ANSI Common Lispの関数を全部実装できたら 不完全であっても強制的にv1.0.0にすると言いました。 ついにそのときがやって来ました。 今まで…

ついにeval-whenにたどり着く

compile-file関数を実装して行ったら、 最後の最後にeval-whenにたどり着きました。 eval-whenは難しいですね。 この機能を調べても全然意味が分かりません。 何に使うものなのかを簡潔に書くことすら難しいです。 たぶん「compile-fileで、コンパイルだけで…

make-load-formとは一体なんなんだ

make-load-formなんて誰も使ってないと思いますが説明します。 いまさらですけど、Common Lispって1994年に制定されているんですよね。 25年近く前の言語でマイナーな関数の説明なんて全く需要ないっすね。 それではmake-load-formを使ってみましょう。 これ…

lexical変数のことが分かったような気がする

lexical変数の設計を色々やってみて、最終的に落ち着いたものについて話します。 たぶんこれが正解に近いのかと。 少しでも速度改善したいと、clispのdisassembleでも見てみようかと思ったときのことです。 速度測定によく使っていたmk.eastasian.lispのextr…

少し早くなったので諦める

npt

以前の結果はこれで、 $ 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 半分以上早くなっていますね。 わりとい…

nptの速度が出ない

npt

前回の投稿では下記の通り、 悪い方向に26倍の速度差を叩き出しました。 ・clisp real 0m2.291s ・npt real 1m1.046s nptが遅すぎる。 これだとnptが遅すぎて使い物にならないという結論です。 しかし高速化はいくつかの案があったので、 それなりに速度差は…

一年が経ちました

npt

早いもので一年が経過しました。 nptの開発のために立ち上げたブログですが、 思ったより進んだような気がします。 ブログを書き始めた当時なんて、絶対作れないと思ってたんですが、 あと残り3つの関数を作成できれば完成です。 ただ、ここからが長いかもし…

Happy Hacking Keyboard Liteの掃除

Happy Hacking Keyboardではありません。 Happy Hacking Keyboard Lite2でもないです。 Happy Hacking Keyboard Liteです。 いつ買ったのかもう記憶にありませんが、ずっと酷使してきました。 今ならレビューできるような気がする。 長所は下記の通り 頑丈過…

共有配列のサイズをむりやり変更する

Common Lispの共有配列の話題です。 共有配列の拡張に関して、細かい所がはっきりしなかったので、 実験した内容をメモとして残します。 共有配列とは、別の配列を参照するだけの配列のことです。 make-arrayに:displaced-to引数を指定することで作成できま…

試しにC言語でCommon Lispを使う

nptの開発は結構進んでおり、 あとはcompile-file, load, stepだけとなりました。 まあバグを含め問題盛りだくさんなんですけどね。 nptの開発目的の一つとして、C言語に組み込んで使うという考えがあります。 だからわざわざnpt-amalgamationという訳の分か…

define-compiler-macroを使ってみる

Common Lispのdefine-compiler-macroを使ってみましょう。 ただ使うだけなら、検索すればすでに何人かの方が このマクロの正しい使い方を書いていますので、 そちらを見ていただいた方が絶対に有益な情報が得られると思います。 本投稿は、誰も話題に出して…

make-instances-obsoleteは何もしてないのでは?

Common Lispの、sbclとcclだけの話になります。 ジェネリック関数make-instances-obsoleteとは、 クラスの再定義に関係するものです。 こいつがよく分からない。 たぶん、クラスを再定義したあとで、 すでに作成されているインスタンスを一斉に更新するとき…