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

如何在Racket/Scheme中生成此代码?,scheme,racket,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写入

我希望以以下方式生成代码:

(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

如何解决这个问题?

您确定您所做的工作确实需要生成代码吗?在您向我们展示的示例中,还没有任何东西需要它,因为您可以这样做。在球拍中:

#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表达式并将其写入文件更好。请参阅:例如。

是的,我正在编写一个解释器,我需要转换代码,并在S表达式中生成新代码以执行每个转换过程(这就是为什么我将S表达式写入文件以执行)。部分原因是我采取了宏观的方法,但不是这个方法,也不是
提供的
,但谢谢你的回答。冒着给你带来更多痛苦的风险,我仍然不清楚(无论如何,对我来说)你是否需要把事情写进一个文件中。我知道您正在编写一个解释器,需要获取用户代码并对其进行操作。然而,你没有理由不能从直接操纵它到评估它,是吗?我想这里可能需要更多的细节…@JohnClements我转换语言是A到s表达式,我想确保转换是语义等价的,我这样做的方式(可能听起来很愚蠢:)是将转换后的代码写入文件,执行它并将结果与执行语言A的结果进行比较。我认为在最后,我将在代码中而不是在文件中对每个短语的结果进行管道化。为什么不在不将其写入文件的情况下对其进行求值呢?Racket模块背后的想法是给你一种隔离/控制评估的能力,你可以通过将其写入文件来实现。我认为你的说法很有道理。很抱歉以前的无知。我肯定会很快适应使用球拍模块。