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)));
}