gpt4 book ai didi

racket - 如何在 Racket 中创建新语言?

转载 作者:行者123 更新时间:2023-12-04 20:28:34 26 4
gpt4 key购买 nike

我想创建一种与键入 Racket 具有相同语法的新语言,但执行时会做两件事:

  • 将给定程序作为键入的 Racket
  • 运行
  • 如果类型检查,则将输入翻译成另一种语言(比如 python)。我打算写一个从打字 Racket 形式到 python 语法的翻译器。

  • 关于如何开始或指向一些骨架代码的任何建议?我已阅读 this tutorial但它主要谈论创建我不需要的新语法。

    我了解如何编写 Racket 代码以将一种语言翻译成另一种语言,但我不明白的是如何同时完成上述两项工作,即首先将其作为另一种语言运行,然后使用相同的输入执行其他操作.

    最佳答案

    听起来你想用新的 #%module-begin 创建一种语言形式。此表单由阅读器插入(当您在文件顶部执行 #lang .... 行时,或者如果您手动编写模块,则由语言插入。无论哪种方式,它通常与您的语言定义相关联。这个宏可以完全访问整个模块的未扩展语法。例如,像这样的宏:

    (provide (rename-out [-module-begin #%module-begin]))
    (define-simple-macro (-module-begin body ...)
    (#%module-begin
    (writeln '(body ...))
    body ...))

    将创建一种做两件事的语言:
  • 打印出代码主体(作为 s 表达式)和
  • 使用 #%module-begin 运行正文语言定义被写入。

  • 您可以看到如何使用这种技术两次抓取程序主体,并用它做两件不同的事情。所以让我们尝试运行这个例子。首先,让我们从上面提取样本,并将其放入文件“mylang.rkt”中:
    #lang racket
    (provide (rename-out [-module-begin #%module-begin])
    (except-out (all-from-out racket) #%module-begin))
    (require syntax/parse/define)
    (define-simple-macro (-module-begin body ...)
    (#%module-begin
    (writeln '(body ...))
    body ...))

    现在我们可以在 mylang 中编写程序像这样:
    #lang s-exp "mylang.rkt"
    (+ 1 2)

    当你运行它时,你会得到这样的东西:
    ((+ 1 2))
    3

    首先它打印出程序文本,然后运行它。

    您可以在 a paper 中阅读有关此过程的更多信息。我写了讨论 the Video language 的这方面.您还可以找到这本书 Beautiful Racket有一些你可能会觉得有用的例子。

    关于racket - 如何在 Racket 中创建新语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51691905/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com