将变量参数LISP函数映射到C函数 – C.

我正在开发一个自定义LISP解释器.它不支持像LISP中那样定义函数,而是将所有函数映射到C函数.当它看到一个表达式时,

(substr 'input '1 '1)

它知道调用内部substr函数并返回结果.

现在我计划实现一个支持基本格式化的消息函数,并将输出写入stdout.就像是,

(message "Hello, %s" name)

%s将替换为变量名中的值.

目前的计划是直接将格式和参数传递给printf等函数.这样,我可以支持printf支持的所有格式.但问题来自可变数量的参数.一种方法是,像,

if(argcount == 1)
   /* call printf with one arg */
else if(argcount == 2)
   /* call printf with two arg */
....

这有效,但我想知道是否有更好的方法来实现这一目标?

最佳答案 我怀疑有办法做到这一点.原因是lisp函数的参数数量仅在运行时已知,但在编译时必须知道C函数的参数数量.

这包括va_lists,除非您想以某种特定于平台的方式破解它们.

你真正能做的最好的事情是在C中编写一个函数,它能够一次循环一个参数并用它们做一些事情.我能看到的唯一方法是不仅为每个内部函数存储一个函数指针,而且还存储一个“调用约定”,它将提供有关它是以普通方式获取参数还是以其完成的信息.相当于一个va_list.

像printf这样的函数会有一个包装器,printf_wrapper,比如说,你将存储一个函数指针给包装器.此包装器将接受格式字符串作为普通参数,后跟其他参数的列表或数组(大致类似于va_list).

您可以通过将printf_wrapper函数的调用约定指定为“va_list_type”来指示printf_wrapper使用需要列表的参数完成,这意味着它需要通常的固定参数,并且所有剩余参数必须捆绑在一起并作为其提供给它一个列表.

当然,编写一个printf_wrapper函数可以将格式字符串拆分并解析成多个格式字符串,这有点工作.这是我正是这样做的一个示例,以便我可以添加自己的自定义格式说明符:

https://github.com/wbhart/bsdnt/blob/v0.26/helper.c

点赞