nptclのブログ

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

2019-03-01から1ヶ月間の記事一覧

Npt Lispの紹介

Nptとは小さいLisp処理系です。 現在開発中です。 https://github.com/nptcl/npt 本ブログは、NptというLispの開発をするにあたり、 難しかったり引っかかった部分をブログに記載して行くことで、 実装の確認をあらためてしていこうという目的がありました。…

引数&keyの内容を指定しない場合を考える

例えば (defmethod aaa (value &key) ...) のように&keyだけを指定して、その後の変数を記載しない場合があります。 全くの無意味のように見えますが、下記2つの場合において意味があります。 続けて&allow-other-keysを指定した場合 defmethodかdefgeneric…

lambdaと記載できる場所はどこか

よく目にする(lambda ...)という表記はかなり特殊なものであり、 マクロを抜きにするならば、限定された場所でしか記述できません。 マクロのlambdaとリードマクロの#'があるため、 式の中で気軽に記載することができるのです。 マクロの例としてはこんな感…

型valuesの使い方

実装していると難しくてイヤになるのが型(typeのこと)です。 型関係の実装で一番難しいのはsubtypepで、ひどいもんです。 今回は難しくはないものの簡単でもない、型valuesについて説明します。 命令valuesではなく、型valuesの方ですので注意。 型とは、…

warnの出力抑制はどうやって実現しているのか

warnの出力を抑制する方法 (handler-bind ((warning #'muffle-warning)) (warn "Hello")) やった! warn関数とその周辺の実装を考える Common Lispのwarningの話題です。 warn関数では警告を出力できますが、 その出力を抑止したい場合はどうしたらいいでし…

非正規化浮動小数の有効桁数を求める

C言語にてCommon Lispのfloat-precision関数を作成したときのメモです。 非正規化の浮動小数とは、値が小さすぎるけど何とかして 浮動小数にて表現したいというギリギリの場合の方法です。 感覚としては、 1.23456 × 10の-103乗 みたいに表現したいけど指数-…

rationalizeのアルゴリズムが全く分からなかった

Common Lispの関数rationalizeの話題です。 関数rationalizeとは、浮動小数を分数に変換する関数です。 例えば浮動小数の0.1を分数に直すと次のようになります。 * (rationalize 0.1) 1/10 実は浮動小数の0.1を1/10に変換するって難しい事なのです。 0.25を1…

closureには何が保存されるのか

closureとは関数にデータを保存するための仕組みです。 Lisp大好きな人はlambdaと一緒に多用します。 例えばこんな使い方をします。 (let ((x 0)) (setq *call* (lambda () (incf x)))) (funcall *call*) -> 1 (funcall *call*) -> 2 (funcall *call*) -> 3 …

分数の割り算で余りを求める

分数の割り算で、余りを求める方法がわからなかったという内容です。 どうも小学校の算数の内容らしいですが、わからなかったのだから仕方がない。 あと「帯分数」というモノを初めて知りました。 習った記憶が全くない。 Common Lispでは、truncate関数を使…

Common LispとC言語で虚数部のゼロ符号に違いが出る

ずっと悩んでいたことがわかったのでメモします。 例えば下記の関数 log(1-z) のzに10を入れると、Common LispとC言語では結果が違います。 Common Lispの例 (defun log1-z (z) (log (- 1.0 z))) (log1-z 10) -> #C(2.1972246 3.1415927) C言語の例 #include <stdio.h></stdio.h>…

C言語にて関数csinlが使えない場合がある

数学のsin関数に複素数って渡せるんですね。 全然知りませんでした。 C言語のc99標準ライブラリにも用意されているようです。 具体的には下記の関数。 csinf, csin, csinl, sin(tgmath) 問題は、clangのlong double complexを引数とする関数がいくつか使えな…

整数を英語で表現する4(序数と負数)

最後に、序数と負数について説明します。 序数 数が0~19までの序数はすでに表に出しています。 例えば13は下記の通り。 * (format t "~:R" 13) thirteenth 20以上の場合、例えば43は次のようになる。 * (format t "~:R" 43) forty-third 40であるfortyは通…