我想以下列方式生成代码:
(define (foo str)
(map (lambda (x) (* 100 x)) (hash-ref dd str)))
(define sth `(begin
(define dd (make-hash (list (cons "L" (list 1 2 3)))))
(hash-set! dd "H" ,(foo "L"))
dd))
(我会将sth
写入sth.rkt
文件并执行它)
但是,这不起作用,因为在foo
的代码中,它引用了生成代码中的dd
标识符,因此尚不存在!
有一种方法可以生成这样的代码:
(define sth `(begin
(define dd (make-hash (list (cons "L" (list 1 2 3)))))
(hash-set! dd "H" (foo "L"))))
并添加函数foo
,但我真的不想在我的最终文件中使用foo
!
我该如何解决这个问题?
答案 0 :(得分:2)
您确定自己在做真正需要代码生成的工作吗?您向我们展示的示例中没有任何内容需要它,因为您可以执行此类操作。在Racket中:
#lang racket
;; When this file is required, dd will be provided to the outside.
(provide dd)
(define (foo str)
(map (lambda (x) (* 100 x)) (hash-ref dd str)))
(define dd (make-hash (list (cons "L" (list 1 2 3)))))
(hash-set! dd "H" (foo "L"))
这是模块,可供其他程序使用。 Racket中的模块隐藏除提供项目之外的所有内容。
如果您可以解释为什么要进行代码生成方法,那么这可能会帮助我们更好地理解这个问题。对于代码生成,宏方法可能比生成s表达式并将其写入文件更好。例如,请参阅:http://docs.racket-lang.org/guide/macros.html。