使用 c 语言的 macro 操作,能够很简单的用 c 语言模拟 lisp 语法。

下面我们来定义 lisp.h 头文件

#ifndef LISP_H_OTE1HWPK
#define LISP_H_OTE1HWPK

#include <stdio.h>
#include <stdlib.h>

#define define(ret, name, args, block) \
    ret name args { return block; }

#define if(expr, block1, block2) \
    expr ? block1 : block2

#define eq(a, b) \
    a == b

#define neq(a, b) \
    a != b

#define sub(a, b) \
    a - b

#define mul(a, b) \
    a * b

#define add(a, b) \
    a + b

#define div(a, b) \
    a / b

#endif /* end of include guard: LISP_H_OTE1HWPK */

然后来用类似于 lisp 的语法编写一段求阶乘的代码:

define(int, factorial, (int n),
       if(eq(n, 0),
          1,
          mul(n, factorial(sub(n, 1)))))

define(int, main, (void),
       (printf("10! = %d\n", factorial(10)), EXIT_SUCCESS))

编写 Makefile:

CFLAGS = -Wall -include "lisp.h"

TARGET=factorial

all:
	gcc -o $(TARGET) $(TARGET).c $(CFLAGS)

clean:
	rm -f $(TARGET)

编译并运行:

liubang@venux-dev:~$ make
gcc -o factorial factorial.c -Wall -include "lisp.h"
liubang@venux-dev:~$ ./factorial
10! = 3628800