external moduleの続き
引数の受け取り方
引数はclisp側で確保された領域に置かれる。
そのため通常のCでの引数のようには扱えず、pushSTACK()、popSTACK()、skipSTACK()などのマクロを通じて、操作する必要がある。
あと、modprep.lispのおかげで、STACK_0、STACK_1のような形でスタックにアクセスできるので、これを使って引数を取り出す。
#include<stdio.h> #define COMPILE_STANDALONE #include "clisp.h" DEFMODULE(test,"TEST") DEFUN(TEST::f,arg1){ printf("consp=%d\n",consp(STACK_0)); skipSTACK(1); }
$ clisp [1]> (test:f 'a) consp=0 A [2]> (test:f '(a b)) consp=1 (A B)
返り値
返り値はVALUES1という形で使えるらしい。
VALUES2の意味は分からない。(多値?)
例)改行の計算
これらのことをふまえて、階乗を求めてみる。
#include<stdio.h> #define COMPILE_STANDALONE #include "clisp.h" DEFMODULE(test,"TEST") int fact(int n){ if(n == 0) { return 1; } else{ return n * fact(n-1);} } DEFUN(TEST::f,arg1){ int n = 0; if(fixnump(STACK_0)){ n = I_to_sint(STACK_0); } skipSTACK(1); VALUES1(fixnum(fact(n))); }