gpt4 book ai didi

c - Chez Scheme 中的 FFI,用于具有可变参数的 C 函数(varargs)

转载 作者:行者123 更新时间:2023-12-04 12:40:05 28 4
gpt4 key购买 nike

我想为 printf 写一个 FFI Chez Scheme 中 C 的函数使用 foreign-procedure .但是我不知道应该把什么作为签名,因为 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")

关于c - Chez Scheme 中的 FFI,用于具有可变参数的 C 函数(varargs),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56909346/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com