【问题标题】:Calling LISP or SCHEME from .NET/C#从 .NET/C# 调用 LISP 或 SCHEME
【发布时间】:2010-07-28 20:15:18
【问题描述】:

在我现有的软件中,我有一个使用自制决策树的基因编程实现,它能够在以数组形式提供给它的一些布尔数据中应用基本逻辑运算符(AND OR NOT)。我使用的平台是带有 SQLServer 后端的 .NET / C#。寻找方法来提高我的基因程序的性能,我得出的结论是,我需要功能语言附带的几乎所有附加功能,我相信 Scheme 或在较小范围内的 LISP 是最好的解决方案,除非我想实现类似的功能COND、IF、比较运算符等我自己扩展了现有的实现。

我向论坛提出的问题是,是否有任何有效的方法可以从 .NET 应用程序调用 Scheme(或 LISP),并以某种数组形式前后传递数据。如果这是不可能的,您是否认为咬紧牙关从头开始实施它会更好,或者我应该寻找替代方法,例如使用文本文件进行通信?

【问题讨论】:

  • 一般来说,Lisps 需要一个与 .NET 运行时不同的运行时,因此调用它们会很困难。上一次我必须混合 C、Fortran 和 Common Lisp(那是十五年前),我必须让主程序是 Lisp。

标签: lisp scheme


【解决方案1】:

DLR 有一个符合 R6RS 的方案实现,称为IronScheme。由于 IronScheme 使用 DLR,因此可以使用标准化的 DLR 嵌入 API 以与嵌入 IronRuby 或 IronPython 完全相同的方式将其嵌入到任何 .NET 应用程序中:

dynamic Scheme = new SchemeEnvironment();
var list = Scheme.list;
var map = Scheme.map;
// and so on

完整的 sn-p 可以在 IronScheme 的作者 leppie 的a blog post 中找到。它还展示了如何将 C# lambda 传递给 Scheme 高阶函数和其他很酷的东西。

【讨论】:

    【解决方案2】:

    除非您使用 IronScheme(上图),否则我可能会使用 ZeroMQ(同时具有 Common Lisp 和 .Net 驱动程序)之类的东西在两个系统之间传递消息。

    【讨论】:

      【解决方案3】:

      我构建了一个轻量级、可嵌入的类 Scheme 语言解释器,完全是为了复杂和可重用的配置。它占用空间小(约 1500 行代码),并且不会向您的应用程序引入任何其他依赖项。

      我从工作中开源了它。它被称为schemy。这里还有 an example application 演示如何以非常复杂的方式使用它。

      我还在this stackoverflow answer 中提供了构建它的一些详细动机。

      希望对你有帮助:)

      【讨论】:

        【解决方案4】:

        为什么不看看 F#?

        (www.fsharp.net)

        它基本上是对 .Net 中 OCaml 的改编。

        或者你总是可以使用IronScheme,但我认为它不够成熟。

        【讨论】:

        • IronScheme 的问题在于他关心性能; F# 在这方面具有相当大的优势,它提供了您可能要求的所有功能语言优点。在大多数情况下,IronScheme 非常棒。
        猜你喜欢
        • 1970-01-01
        • 2011-10-17
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-15
        • 2020-03-20
        相关资源
        最近更新 更多