Common Lisp
ANSI Common LispのDictionaryの翻訳が終わりました。 トップはここ。 https://nptcl.github.io/npt-japanese/md/ansicl/index.html 気が向いたらformatの構文のところだけ翻訳するかもしれません。 ~Aの使い方とかいつもいつも自分が困ってるんで。 翻訳し…
以前の投稿 ANSI Common LispのDictionaryだけ翻訳したい - nptclのブログでは、 Dictionaryだけを日本語に翻訳して行こうと話しましたが、 残念ながらまだ全部は翻訳できていません。 とはいえ現段階では70%くらい完了しました。 これが終わったらnptをい…
C言語とCommon Lispで、base64を扱うコードを作成しました。 https://github.com/nptcl/hypd develop/base64 base64.c base64.h base64.lisp base64のコードはすでに何人も作成しており、 C言語では検索するだけでコードがいっぱい出てきます。 Common Lisp…
Dictionaryだけ翻訳したいです。 Dictionaryだけです。 ANSI Common Lisp仕様書の、各章にあるDictionaryだけを翻訳していきます。 ということで、ここでやって行きます。 まだ全然できていません。 https://nptcl.github.io/npt-japanese/docs/ansicl/index…
1. はじめに FFT(高速フーリエ変換)の話題です。 まずは、ただコピーして使えるやつを示します。 そのあと長々と説明します。 (defun fftcore (v n sign) ;; bit reverse (let (a b y) (dotimes (x n) (setq a (ash n -1) y 0 b x) (do () ((zerop a)) (se…
前回:Common LispでLALR(1)のparserを作る4 - nptclのブログ 1. 続きです Common LispでLALR(1)を作りました! 次にやることはでっかい構文を読み込ませることです。 ここではC言語の文法について見ていきます。 2. 大きな構文解析 C言語の構文解析をしてみ…
前回:Common LispでLALR(1)のparserを作る3 - nptclのブログ 1. 続きです Common LispでLR(1)の表を作りました! あとは実行してみて、そのあとでLALR(1)もやってみます。 2. 構文解析の実行 実行するためには、新たにスタックが必要になります。 すでに構…
前回:Common LispでLALR(1)のparserを作る2 - nptclのブログ 1. 続きです Common LispでひたすらLR(1)を作成するコーナーです。 CLOSUREまで作ったので、状態遷移表の作成に入ります。 2. GOTO CLOSUREができたら、次はGOTOを作りましょう。 まずは定義から…
前回:Common LispでLALR(1)のparserを作る1 - nptclのブログ 【変更】first-parseを修正しました。 1. 続きです Common Lispでひたすらparserを作っていきます。 前回は、shift, reduceについて解説しました。 今回はLR(1)をひたすら作っていきます。 ここ…
1. はじめに Common LispでLALR(1)のparserを作りたくなりました。 ここでは、ただひたすらparserを作っていきます。 テストコードですが完成版を先に置いておきます。 https://github.com/nptcl/parser/blob/main/blog/parser.lisp 2. parserの説明 parser…
ちゃんとメモしておきます。 まずはbytespecから 1. bytespec 位置とサイズを保有するオブジェクトです。 次のようにして生成します。 (byte size pos) 下記の例は「3番目から7個」という意味。 (byte 7 3) 図であらわします。 098769876543210 ------------…
磯野ォ~、非決定性やろうぜ~!みたいなノリで、NFAを扱えないか考えていました。 PrologでNFAを扱うのはそんなに珍しい事じゃないと思いますので、 やっている人は沢山いると思います。 同じようにCommon LispでNFAを扱う人も普通にいます。 過去に自分もN…
前の投稿Prologのようなものを作る - nptclのブログでは、 Common LispでPrologのようなものを作りました。 これが想像以上にPrologっぽかったので驚きました。 ちゃんとPrologしてますよ。 実は今まで私はPrologを使ったことがありませんでした。 でもせっ…
Common LispでPrologのようなものを作りましたが。 こういうことをしてる人っていっぱいいると思います。 目新しい事ではないと思いますけど、苦労したので公開します。 もっと簡単にできると思ってたのに難しかったです。 本当はPrologを作るにあたっての注…
目次 はじめに 使い方 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はオプションではなく必須の機能です。 特にエラーで使用します…
あまり考えたことが無かったのですけど、 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…
getfはplistの値を操作するアクセス関数です。 取得する方の構文は、 (getf plist indicator &optional default) みたいな感じです。 設定の方はこんな感じ。 (setf (getf place indicator &optional default) new-value) 説明では、setfでgetfを使うときにd…
下記に移動しました。 ★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 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…
Common Lispの共有配列の話題です。 共有配列の拡張に関して、細かい所がはっきりしなかったので、 実験した内容をメモとして残します。 共有配列とは、別の配列を参照するだけの配列のことです。 make-arrayに:displaced-to引数を指定することで作成できま…
nptの開発は結構進んでおり、 あとはcompile-file, load, stepだけとなりました。 まあバグを含め問題盛りだくさんなんですけどね。 nptの開発目的の一つとして、C言語に組み込んで使うという考えがあります。 だからわざわざnpt-amalgamationという訳の分か…
Common Lispのdefine-compiler-macroを使ってみましょう。 ただ使うだけなら、検索すればすでに何人かの方が このマクロの正しい使い方を書いていますので、 そちらを見ていただいた方が絶対に有益な情報が得られると思います。 本投稿は、誰も話題に出して…