如何判断变量的值是否是绑定到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规范中找到这个,但是找不到类似的东西。

答案

这条路?

  1. 检查它是否是一个符号
  2. 使用EVAL评估符号以获得其值
  3. 检查结果是否是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判断应用是否安装

Racket Lang - Scheme如何组合环境的变量和值列表

MATLAB 如何判断某变量等于某数组中的一个元素

如何将 R 会话中的值替换为 SQL 绑定变量占位符?

将变量的值绑定到文本输入

在 Scheme 标准中是不是存在这样的过程,如果存在,它是如何调用的?