2014-02-16 54 views
-1

比方說,我有以下兩個文件:狡詐/計劃 - 重新定義另一模塊的內部功能

;; demo.scm 
(define-module (demo) 
    #:export (f)) 

(define (g x) 1) 
(define (f x) (g x)) 

...並在同一目錄下:

;; use-demo.scm 
(add-to-load-path ".") 
(use-modules (demo)) 

(define (g x) (+ x 1)) 
(display (f 5)) 
(newline) 

運行在狡詐use-demo.scm(2 ),我得到輸出1。所以它看起來像功能f已'關閉'在模塊demo中定義的功能g。有什麼辦法可以解決這個問題嗎?我真的想要使用我已在use-demo.scm中重新定義的g版本。

回答

1

好吧,只是爲了記錄,我做了一些研究,併發布解決方案以解決這個特定問題,以防萬一它有助於某人。

訣竅是重新定義g在本地,而是「注入」的新功能爲名稱值的demo模塊的映射。

(add-to-load-path ".") 
(use-modules (demo)) 

(module-define! (resolve-module '(demo)) 'g 
    (lambda (x) (+ x 1))) 

(display (f 5)) 
(newline) 
0

如果你有,你想成爲能夠覆蓋特定的功能,你可以讓他們使用配置parameters。這有一定的優勢:

  1. 你並不需要調用reload-module把模塊放回原來的配置。
  2. 這些更改僅適用於需要修改的行爲的代碼的範圍。
  3. 它使用多線程時可以正常工作。

很明顯,主要缺點是,你需要添加一些樣板爲要允許覆蓋(雖然這就是健康宏的,嘿嘿)各項功能。

以下代碼可能有效。我沒有運行它。顯然,如果你可以提供關於這個功能的應用程序的一些額外的信息,我可能會建議替代方法(還有其他一些方法)。

+0

謝謝彼得。我結束了這樣做:https://github.com/yawaramin/ggspec/blob/7feaef3b00348cac8415ec1f47d3057496b81009/lib.scm#L81 – Yawar

+1

嗯。你的輕量級單元測試框架比我的小(https://github.com/peter-b/geda-gaf/blob/master/libgeda/scheme/unit-test.scm)。 :-P您可能希望竊取我對'assert-thrown'宏的想法。 –

+0

顯然,在一個「真正的程序」中,如果多個線程正在運行,您的'stub'宏可能會很活躍,但它看起來像是一個用於測試目的的出色解決方案! –