2009-09-21 34 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

相關問題