如何判断变量的值是否是绑定到Scheme中过程的符号?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断变量的值是否是绑定到Scheme中过程的符号?相关的知识,希望对你有一定的参考价值。
我熟悉Common Lisp并尝试学习一些Scheme,所以我一直在努力理解我如何使用Scheme来解决我通常在Common Lisp中编写的问题。
在Common Lisp中有fboundp
,它告诉我符号(变量的值)是否与函数绑定。所以,我会这样做:
(let ((s (read)))
(if (fboundp s)
(apply (symbol-function s) args)
(error ...)))
这可能在Scheme中吗?我一直试图在R6RS规范中找到这个,但是找不到类似的东西。
答案
这条路?
- 检查它是否是一个符号
- 使用
EVAL
评估符号以获得其值 - 检查结果是否是
PROCEDURE?
的过程
另一答案
在Scheme中,函数不像Common Lisp中的符号那样绑定。如果您需要知道值是否实际上是一个过程,您可以使用procedure?
谓词:
(if (procedure? s) (do-something-with s) (do-something-else))
在便携式Scheme中没有直接的方法来实现,你的示例代码想要做什么,因为Scheme中的符号只是一种统一的字符串,缺少Common Lisp的值/函数/ 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))
即,定义自己的“好”功能映射。这样做的好处是,您可以将功能集限制为“安全”功能,或者无论如何。
以上是关于如何判断变量的值是否是绑定到Scheme中过程的符号?的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms 中iOS通过URL Scheme判断应用是否安装