2009-09-21 28 views
3

我熟悉Common Lisp的,并试图了解一些方案,所以我一直在试图理解我怎么会使用计划的东西,我通常代码Common Lisp中。如何判断一个变量的值是否是绑定到Scheme中某个过程的符号?

Common Lisp中有fboundp,它告诉我,如果一个符号(变量的值)被绑定到一个函数。所以,我会这样做:

(let ((s (read))) 
    (if (fboundp s) 
     (apply (symbol-function s) args) 
     (error ...))) 

在Scheme中可能吗?我一直试图在R6RS规范中找到它,但没有发现类似的东西。

回答

5

这样?

  1. 检查它是否是一个符号
  2. 评估使用EVAL以获得其价值
  3. 检查,如果结果是一个PROCEDURE?
+1

嘿,这工作! :-)在将结果存储在变量p中之后,我可以将它用作过程,如“(p ag1 arg2)”中所示。 谢谢! – Jay 2009-09-21 09:46:05

+0

在CL(SBCL)中不起作用,因为在未绑定符号上调用_eval_会导致错误。在CL应该使用_boundp_ – dbow 2017-08-05 18:05:22

+1

@dbow问题已经指出,在Common Lisp中使用boundp和fboundp;问题是如何在*计划*这样做,而这个答案直接回答它 – xdavidliu 2018-03-02 18:51:54

4

在流程,功能不依赖于程序的符号像他们在Common Lisp中的符号。如果你需要知道,一个值是否实际上是一个过程,你可以使用procedure?断言:

(if (procedure? s) (do-something-with s) (do-something-else)) 

有便携式方案来实现,您的示例代码想做的事没有直接的方法,如符号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)) 

即定义自己的“好”的功能映射。这样做的好处是,您可以将功能集仅限于“安全”功能或任何其他功能。

+0

“这样做的好处,你可以设定的功能仅限制于‘安全’的人,或任何责任。” - 好的,但这个想法实际上并不是要列出所有的功能。写一个新的,它是可用的。为了安全起见,我可以确保像这样调用的所有函数都在一个特定的包中。 – Jay 2009-09-21 09:39:48

+0

套餐(在计划中)? – Dirk 2009-09-21 09:53:49

+0

@Dirk:我的意思是Common Lisp。我想这在Scheme中是不可能的。 – Jay 2009-09-21 15:12:29

相关问题