我熟悉Common Lisp,并试图学习一些Scheme,所以我一直在尝试了解如何使用Scheme来处理我通常用Common Lisp编写的代码。
在Common Lisp中有fboundp,它告诉我一个符号(变量的值)是否绑定到一个函数。所以,我会这样做:
(let ((s (read)))
(if (fboundp s)
(apply (symbol-function s) args)
(error ...)))在Scheme中这是可能的吗?我一直试图在R6RS规范中找到这一点,但找不到任何类似的东西。
发布于 2009-09-21 09:33:53
这边请?
检查结果是否为symbol
EVAL获取其值
PROCEDURE?的过程
发布于 2009-09-21 09:34:42
在Scheme中,函数不像在Common Lisp中那样绑定到符号。如果你需要知道一个值是否真的是一个过程,你可以使用procedure?谓词:
(if (procedure? s) (do-something-with s) (do-something-else))在可移植的Scheme中没有直接的方法来实现你的示例代码想要做的事情,因为Scheme中的符号只是一种统一的字符串,缺少Common Lisp的value/function/plist插槽。
您可以尝试如下所示:
(define function-table (list `(car ,car) `(cdr ,cdr) `(cons ,cons) `(display ,display)))
(let* ((s (read))
(f (cond ((assq s function-table) => cadr)
(else (error "undefined function")))))
(apply f args))也就是说,定义你自己的“好”函数映射。这样做的好处是,您可以将函数集限制为仅“安全”的函数,或者其他任何函数。
https://stackoverflow.com/questions/1453588
复制相似问题