Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Racket 参见第0阶段中的第1阶段计算结果_Racket_Metaprogramming - Fatal编程技术网

Racket 参见第0阶段中的第1阶段计算结果

Racket 参见第0阶段中的第1阶段计算结果,racket,metaprogramming,Racket,Metaprogramming,假设我有一个模块,在Racket中有非平凡的define“override”。该“覆盖”收集有关过程体的信息并将其存储到映射中(在编译阶段)。现在,我需要在运行时阶段使用收集的信息。直截了当的套路似乎行不通: #lang racket (require (for-syntax racket)) (define-for-syntax map-that-should-be-used-in-phase-0 (make-hash)) (define-for-syntax (fill-in-usefu

假设我有一个模块,在Racket中有非平凡的
define
“override”。该“覆盖”收集有关过程体的信息并将其存储到映射中(在编译阶段)。现在,我需要在运行时阶段使用收集的信息。直截了当的套路似乎行不通:

#lang racket

(require (for-syntax racket))

(define-for-syntax map-that-should-be-used-in-phase-0 (make-hash))
(define-for-syntax (fill-in-useful-information n) (hash-set! map-that-should-be-used-in-phase-0 n n))

; Suppose that some useful information is collected here and stored into a map
(define-syntax (fill-in-map stx)
  (begin
    (fill-in-useful-information 1)
    (fill-in-useful-information 2)
    (syntax/loc stx (displayln "OK, the map is filled, but I cannot see it here"))))

(define-syntax (print-that-map stx)
  (syntax/loc stx (displayln map-that-should-be-used-in-phase-0))) ; <-- This can not be compiled

(fill-in-map)
(print-that-map)
#朗球拍
(需要(用于语法球拍))
(定义语法映射-that-should-use-in-phase-0(生成散列))
(定义语法(填写有用信息n)(散列集!map-that-should-be-use-in-phase-0 n))
; 假设这里收集了一些有用的信息并存储到地图中
(定义语法(填写地图stx)
(开始
(填写有用信息1)
(填写有用信息2)
(syntax/loc stx(displayln“好的,地图已填充,但我在这里看不到”))
(定义语法(打印该映射stx)

(语法/loc stx(displayln map-that-should-be-use-in-phase-0)) 引用变量的标识符不能被编译,但它引用的值可以被编译,只要它是Racket提供的内置数据结构之一,并且是不可变的

可以使用
quasisyntax
unsyntax
将哈希表值粘贴到语法对象中

> (quasisyntax (foo #,(hash 'a 4 'b 16)))
#<syntax:5:15 (foo #hash((a . 4) (b . 16)))>

我承认,我完全不明白为什么这个问题被否决了。“对我来说似乎是个好问题。”亚历克西斯金谢谢你的评论,我也不知道为什么。我希望他们用逗号解释原因。
(define-for-syntax (hash->immutable-hash hsh)
  (make-immutable-hash (hash->list hsh)))

(define-syntax (print-that-map stx)
  (quasisyntax/loc stx (displayln #,(hash->immutable-hash map-that-should-be-used-in-phase-0))))