Как я могу сгенерировать этот код в Racket / Scheme? - PullRequest
1 голос
/ 11 января 2012

Я хочу сгенерировать код следующим образом:

(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 Ответ

2 голосов
/ 11 января 2012

Вы уверены, что выполняете работу, которая действительно требует генерации кода? Ничто в приведенном нами примере пока не требует этого, поскольку вы можете сделать что-то подобное. В ракетке:

#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 .

...