如何在Racket / Scheme中生成此代码?

时间:2012-01-11 01:03:03

标签: scheme racket

我想以下列方式生成代码:

(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! 我该如何解决这个问题?

1 个答案:

答案 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