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して、第一引数に渡すみたい。