Chez Scheme 中的 FFI 用于带有可变参数(varargs)的 C 函数
FFI in Chez Scheme for C functions with variadic arguments (varargs)
我想使用 foreign-procedure
在 Chez Scheme 中为 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 . args)
(foreign-procedure "printf"
(string args) int))
这也不起作用:
(define (print-format)
(foreign-procedure "printf"
(string ...) int))
如何在 foreign-procedure
的函数签名中指定可变参数?
虽然不是最终的解决方案,
您可以使用宏来容纳可变数字
系统调用的参数。
create-list
用于向 foreign-procedure
提供适当数量的参数
系统调用。
例如宏调用
(print-format "Hello %s and %s" "Ryan" "Greg")
扩展为
((foreign-procedure "printf" (string string string) int) "Hello %s and %s" "Ryan" "Greg")
(define create-list
(lambda (element n)
"create a list by replicating element n times"
(letrec ((helper
(lambda (lst element n)
(cond ((zero? n) lst)
(else
(helper
(cons element lst) element (- n 1)))))))
(helper '() element n))))
(define-syntax print-format
(lambda (x)
(syntax-case x ()
((_ cmd ...)
(with-syntax
((system-call-spec
(syntax
(create-list 'string
(length (syntax (cmd ...)))))))
(with-syntax
((proc (syntax
(eval
`(foreign-procedure "printf"
(,@system-call-spec) int)))))
(syntax
(proc cmd ...))))))))
(print-format "Hello %s!" "Ryan")
(print-format "Hello %s and %s" "Ryan" "Greg")
我想使用 foreign-procedure
在 Chez Scheme 中为 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 . args)
(foreign-procedure "printf"
(string args) int))
这也不起作用:
(define (print-format)
(foreign-procedure "printf"
(string ...) int))
如何在 foreign-procedure
的函数签名中指定可变参数?
虽然不是最终的解决方案, 您可以使用宏来容纳可变数字 系统调用的参数。
create-list
用于向 foreign-procedure
提供适当数量的参数
系统调用。
例如宏调用
(print-format "Hello %s and %s" "Ryan" "Greg")
扩展为
((foreign-procedure "printf" (string string string) int) "Hello %s and %s" "Ryan" "Greg")
(define create-list
(lambda (element n)
"create a list by replicating element n times"
(letrec ((helper
(lambda (lst element n)
(cond ((zero? n) lst)
(else
(helper
(cons element lst) element (- n 1)))))))
(helper '() element n))))
(define-syntax print-format
(lambda (x)
(syntax-case x ()
((_ cmd ...)
(with-syntax
((system-call-spec
(syntax
(create-list 'string
(length (syntax (cmd ...)))))))
(with-syntax
((proc (syntax
(eval
`(foreign-procedure "printf"
(,@system-call-spec) int)))))
(syntax
(proc cmd ...))))))))
(print-format "Hello %s!" "Ryan")
(print-format "Hello %s and %s" "Ryan" "Greg")