【问题标题】:Lisp/Scheme DSEL in C++C++ 中的 Lisp/Scheme DSEL
【发布时间】:2011-02-24 08:00:01
【问题描述】:

我在boost mailing lists(强调我的)上看到了以下帖子:

大家好,

有人知道现有的精神/口齿不清的实施吗? 有兴趣开发这样的开源项目吗?

还没有,AFAIK。

我将为 Spirit2 编写一个示例 补充 tiny-C 虚拟 机器在那里。 什么是平等的 有趣的是那个方案(或 至少它的一个子集)可以是 用纯 C++ 实现。没有解析, 只是 C++ 中的纯 DSEL。现在,想象一个 针对此 DSEL 的解析器(通过 C++)——源到源的翻译器。 本质上,您的方案代码将是 编译成高效的 C++。

真的有人做过吗?我会对这样的 DSEL 非常感兴趣。

【问题讨论】:

  • 虽然我对方案没有兴趣,但我真的很想看到这样的东西:)
  • 这可能适用于 Scheme 功能的一小部分。我无法想象这适用于 Scheme 宏或延续。 ;-)
  • @Chris:继续,可能不会。但是宏……C++ 可能会让我们大吃一惊。
  • @Matthieu,我也是。我会特别是。想看看实现者将如何在“纯 C++”中处理垃圾收集...
  • 这个不是基于boost,但无论如何-intelib.org

标签: c++ boost lisp scheme dsel


【解决方案1】:

我使用 C++ 中的 Spirit 编写了一种名为 Funky 的类 Lisp 语言。 http://funky.vlinder.ca 提供开源版本。将它变成类似 Lisp 的 C++ 翻译器并不需要太多。

实际上,它需要一个运行时支持库来提供通用关闭时间等:如果你想将 Lisp 代码转换为高效的 C++,你基本上需要 C++ 类(函子等)来做进入运行时的繁重工作,因此您的 Lisp-to-C++ 翻译器需要:

  1. 解析 Lisp
  2. 从 Lisp 创建一个 AST
  3. 如果可能,转换 AST 以对其进行优化(Lisp 中的优化与 C++ 中的优化不同,因此如果您想要快速恢复 C++,您必须优化 Lisp 并让您的 C++ 编译器优化生成的 C++)
  4. 生成 C++,为此您需要依赖运行时支持库来处理内置函数、仿函数类型等内容。

如果你从 Funky 开始,你已经有了解析和 AST(尽管 Funky 没有优化 AST),所以你可以从那里创建运行时并生成 C++。 .

从头开始编写也不会太复杂:Lisp 语法并没有那么难,所以大部分工作都会涉及到 AST 和运行时支持。

如果我现在不编写面向对象的 DSL,我可能会尝试一下。

【讨论】:

  • 有趣...您认为这种翻译可以在编译时完成,即使用元编程吗?
  • @HighCommander4 在元编程时你已经可以做很多函数式编程了:元函数可以“返回”元函数,循环被实现为对元函数的递归“调用”,等等。问题是它看起来(或感觉)不像 Lisp 并且让 C++ 元编程语法看起来像 Lisp(即使你把 '(' 变成 '').. . 我想这是可行的,但如果它真的有用,我会感到惊讶......
【解决方案2】:

方案到(可读)C++ http://www.suri.cs.okayama-u.ac.jp/servlets/APPLICATION.rkt

这个怎么样

【讨论】:

  • 这很有趣(有源代码吗?)。然而,这不是我想要的。我一直在寻找一个 C++ 库(很可能使用模板元编程和/或预处理器元编程实现),它允许您在 C++ 中编写看起来像(中缀、S 表达式)和行为像(宏、模式匹配)方案的代码。
  • 其实挺有意思的。我很想看看代码。问题是,实际上生成 .h 和 .cpp 的翻译器非常少(如果有的话),就好像它们是用 C++ 编写的一样。
【解决方案3】:

不确定这是否是您想要的,但是:

http://howtowriteaprogram.blogspot.com/2010/11/lisp-interpreter-in-90-lines-of-c.html

至少看起来像是一个开始。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多