具有可变参数(varargs)的C函数的FFI-in-Chez格式

具有可变参数(varargs)的C函数的FFI-in-Chez格式,c,printf,scheme,variadic,chez-scheme,C,Printf,Scheme,Variadic,Chez Scheme,我想使用外部程序为Chez方案中C的printf函数编写一个FFI。但是我不知道应该把什么作为签名,因为printf函数中的最后一个参数是可变参数。这是我的密码: (import (chezscheme)) (define (print-format) (foreign-procedure "printf" (string void*) int)) ;; <-- Here, the type format is "(arg arg ...) ret" (pri

我想使用
外部程序
为Chez方案中C的
printf
函数编写一个FFI。但是我不知道应该把什么作为签名,因为
printf
函数中的最后一个参数是可变参数。这是我的密码:

(import (chezscheme))

(define (print-format)
    (foreign-procedure "printf" 
        (string void*) int)) ;; <-- Here, the type format is "(arg arg ...) ret"

(print-format "Hello, %s!" "Ryan")
这也不起作用:

(define (print-format)
    (foreign-procedure "printf" 
        (string ...) int))

如何在函数签名中为
外部过程指定可变参数?

尽管这不是最终解决方案, 您可以使用宏来容纳变量编号 系统调用的参数类型

创建列表
用于向
外部程序提供适当数量的参数
系统调用

例如,宏调用

(打印格式为“Hello%s和%s”“Ryan”“Greg”)

扩展为

((外部过程“printf”(字符串)int)“您好%s和%s”“Ryan”“Greg”)

(定义创建列表
(λ(元素n)
“通过复制元素n次来创建列表”
(letrec)((helper)
(λ(第一个元素n)
(条件((零?n)lst)
(其他
(助手)
(cons元素lst)元素(-n1(()()())))
(helper'()元素n)))
(定义语法打印格式)
(λ(x)
(语法大小写x()
((cmd…)
(带语法)
((系统调用规范)
(语法
(创建列表字符串)
(长度(语法(cmd…)
(带语法)
((proc)(语法)
(评估
`(国外程序“printf”
(,@system call spec)int(()()))
(语法
(proc cmd…)(()()()))
(打印格式为“Hello%s!”)
(打印格式为“Hello%s和%s”“Ryan”“Greg”)

谢谢。虽然这看起来不容易。我很害怕。
(define (print-format)
    (foreign-procedure "printf" 
        (string ...) int))