nptclのブログ

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

C言語

C言語でMD5を取得する

1. はじめに 以前、C言語でxorshiftの乱数を使う投稿をしましたが、 その中で乱数の初期値を決めるためだけに MD5を使っていたと話しました。 一応そのファイルの使い方も紹介します。 せっかく作ったんですし、 書いておかないと自分が忘れますので。 でも…

DEFLATEの展開コードを作る

1. はじめに C言語でDEFLATEという圧縮アルゴリズムの展開コードを作りました。 ただし次の二点において問題があるためお勧めできません。 zlibに比べるととても遅い 圧縮はまだ作ってない でも放置すると忘れるのでgithubに登録しました。 自分自身が忘れな…

C言語でUTF-8などを読む

1. はじめに C言語で、UTF-8などを読み込むコードを作成しました。 これもnptの抜き出しです。 https://github.com/nptcl/hypd/tree/main/develop/unicode たぶん私だけだと思いますが、 UTF-8の読み込みは本当によく使います。 どれだけ同じようなものを作…

C言語でxorshiftの乱数を使う

1. はじめに C言語でxorshiftという乱数発生を使うコードを作成しました。 前回のeastasianと同じように、nptから抜き出したものです。 配布はここ。 https://github.com/nptcl/hypd/tree/main/develop/random 最初にひどいことを言っておきますが、 私はこ…

C言語でEast Asian Widthを調べる

1. はじめに C言語でEast Asian Widthを調べるコードを作りました。 作ったといってもnptのソースから抜き出しただけですが。 配布はここ。 https://github.com/nptcl/hypd/tree/main/develop/eastasian ある機能がnpt内だけで使えるというのは個人的に不便…

base64の変換を作る

C言語とCommon Lispで、base64を扱うコードを作成しました。 https://github.com/nptcl/hypd develop/base64 base64.c base64.h base64.lisp base64のコードはすでに何人も作成しており、 C言語では検索するだけでコードがいっぱい出てきます。 Common Lisp…

C言語で円周率の値を使う

円周率とは3.14のことです。 本当はもっと桁数があるので、前回の投稿では次のようにしていました。 #define PI 3.141592653589793238462643383276 小数桁数が30の例です。 FreeBSDで次のように実行すれば出てきます。 $ echo 'scale=30; a(1)*4' | bc -l 3.…

Common LispでFFTを使う

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を作る5

前回:Common LispでLALR(1)のparserを作る4 - nptclのブログ 1. 続きです Common LispでLALR(1)を作りました! 次にやることはでっかい構文を読み込ませることです。 ここではC言語の文法について見ていきます。 2. 大きな構文解析 C言語の構文解析をしてみ…

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

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

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

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

npt-amalgamationの作成

私はnptというCommon Lisp処理系を細々と開発しています。 まだ目標であるANSI Common Lispの機能は完成していませんが、 以前紹介したときに言った「sqlite3みたいにamalgamationをやってみたい」 というのが先にできたので公開します。 npt-amalgamation h…

C言語のconstの使い方

今までconstの書き方がよくわかっていませんでした。 で、調べたら予想以上に難しかったです。 本投稿ではconstの使い方を記載していくわけですが、 規約を調査したわけではなく、Cコンパイラで実験した内容です。 もしかしたらおかしい所があるかもしれませ…

Npt Lispの紹介

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

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

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

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を引数とする関数がいくつか使えな…