CodeReading: newlisp
GCが無いLispのnewlispのソースを読んでみたメモ
- githubにあるミラーをダウンロード
git clone https://github.com/kosh04/newlisp
-
% git show --shortstat | grep -v Author commit 9eb8f27de842ebe96e8a6f8e631ffd3fa37d4611 Date: Thu May 16 17:31:58 2019 +0900 Enable Travis CI IPv6 loopback network for testing (#15) Enable ipv6 using sysctl 3 files changed, 12 insertions(+), 2 deletions(-)
-
% cloc . 268 text files. 107 unique files. 170 files ignored. github.com/AlDanial/cloc v 1.96 T=1.22 s (87.8 files/s, 79210.0 lines/s) --------------------------------------------------------------------------------------- Language files blank comment code --------------------------------------------------------------------------------------- C 23 7292 3808 30625 HTML 15 9000 1567 28848 Lisp 31 1221 3491 4276 C/C++ Header 7 463 501 2656 Bourne Shell 7 104 53 616 JavaServer Faces 1 26 0 503 Text 10 148 0 487 make 4 40 58 220 vim script 1 37 57 152 YAML 2 25 2 116 CSS 1 9 0 38 Markdown 1 16 0 34 XML 1 0 5 18 DOS Batch 1 4 0 16 Windows Module Definition 2 0 0 16 --------------------------------------------------------------------------------------- SUM: 107 18385 9542 68621 ---------------------------------------------------------------------------------------
- Cとマニュアルだな。
- newlisp.h
- 745行
- 見所はどこだ
- SYMBOL
- シンボルを差すvalueオブジェクトかと思ったが、どっちかというとスロットみたい。
- colorっていうフィールドがあってギョっとしたが、赤黒木なのか。
- flag ビットでフラグが入ってる。
- name char*
- contents
- context
- 以下赤黒木用
- color
- parent
- left
- right
- CELL
- 種類がある。数値、文字列、etc
- どういう構造なんだ?consとcarが一体化されてる?いや、でもCELL_CELLというtypeはないな。
- 文字列の場合auxに長さが、contentに本文が入るみたい。
- CELL_QUOTEの場合は、contentsがそのままメインのセル
- CELL_INT64の場合は、AUXに値が入ってるみたい。
- CELL_LONGの場合はcontentsに値が入ってる。統一しないのか?
- type
- next
- aux
- contents
- ノリがわかってきた、nextはCELL単体で意味があるんじゃなくて、例えば関数の引数列の時の次のポインタだ。
- flagという名前のintフィールドと、#defineされた数字だとどれがどれ用なのかわからん。
- newlisp.c
- compileExpression パーサー。
- evaluateExpression eval
- deleteList いろいろ開放
- STRINGとかじゃないとコンテンツは開放されない。
- ユーザー(ライブラリ)拡張型はないのか。
- CELL*を返すC側の関数が、所有権を返すかどうかよくわからん。関数による?
- popResultFlagというグローバル変数にもよりそう。
- p_setf
- 第一、第二引数をevaluateExpressionして、第一引数に渡すみたい。
この記事へのご意見、ご感想、コメントは、
twitter
か下のフォーム(実験的)へどうぞ。