1

次の 2 つのファイルがあるとします。

;; 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.scmGuile (2) で実行すると、出力が得られます1。そのため、関数がmodule で定義されている関数fを「閉じた」ように見えます。これを回避する方法はありますか?で再定義した のバージョンを本当に使いたいです。gdemoguse-demo.scm

4

2 に答える 2

3

OK、記録のために、私はいくつかの調査を行い、誰かに役立つ場合に備えて、この特定の問題の解決策を投稿しています.

秘訣は、ローカルで再定義するのではなく、モジュールの名前から値へのマッピングにg新しい関数を「注入」することです。demo

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

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

(display (f 5))
(newline)
于 2014-02-16T22:00:54.613 に答える