【问题标题】:Using Lisp in C#在 C# 中使用 Lisp
【发布时间】:2008-09-16 07:13:03
【问题描述】:

正如this question 中很多人指出的那样,Lisp 主要用作学习体验。尽管如此,如果我能以某种方式使用我的 Lisp 算法并将它们与我的 C# 程序结合起来,那就太好了。 在大学里,我的教授永远不会告诉我如何在程序中使用我的 Lisp 例程(不,不是用 Lisp 编写 GUI,谢谢)。 那我该怎么办?

【问题讨论】:

    标签: c# lisp


    【解决方案1】:

    试试 Lisp 的这些 .Net 实现:

    IronScheme 的目标是成为 R6RS 符合方案实施为基础 在 Microsoft DLR 上。

    L Sharp .NET 是一个强大的类 Lisp .NET 的脚本语言。它使用一个 Lisp 方言类似于 Arc 但 与 .NET 紧密集成 提供丰富的框架 图书馆。

    【讨论】:

    • 值得注意的是,IronScheme 是由 StackOverflow 的活跃用户 Leppie 开发的。
    【解决方案2】:

    Clojure 是一种 Lisp-1,它编译为 Java 字节码,带来非常好的运行时性能。您可以使用 Clojure,并使用 IKVM 的 ikvmc 将其交叉编译为 .NET 程序集。当然,在 .NET 中使用时,Clojure 会愉快地生成 .NET IL,从而获得与在 JVM 上使用时相同的编译代码性能。

    【讨论】:

      【解决方案3】:

      如果它只是您想使用的例程,您可以尝试 LSharp,它可以让您在 .NET 中使用 Lisp 表达式:

      http://www.lsharp.org/

      另一种方式(使用 Lisp 中的 .NET)将是 RDNZL:

      http://www.weitz.de/rdnzl/

      【讨论】:

        【解决方案4】:

        .Net 1.1 SDK 包含一个 LISP 编译器示例。见 SDK\v1.1\Tool 开发者指南\Samples\clisp

        【讨论】:

          【解决方案5】:

          我知道这是一个非常古老的问题。但我会尝试从我自己的经验和角度来提供答案。

          对于像我们这样喜欢 Scheme/Lisp 的纯粹、优雅和简单的人,我希望这能给你一些鼓励和启发,让它们在实际生产中非常有用:)

          我最近从名为schemy 的工作中开源了一个类似于 Scheme 的解释器,它是用 C# 编写的(大约 1500 行代码)。这是动机以及它的用处 -

          没有过多的细节,我正在构建一个 Web API 服务器,其他开发人员/数据科学家希望其请求处理逻辑是即插即用的。这里有一个明确的关注点分离需求 - 服务器不太关心请求处理逻辑,但它需要知道它可以处理哪些请求以及在哪里找到和加载逻辑处理程序。

          因此,服务器并没有将处理程序实现放在服务器应用程序中,而是仅提供可重用的“块”,这些“块”可以根据某些标准和逻辑链接在一起以形成 管道,即处理程序通过配置定义。我们尝试使用 JSON/XML 来描述这样的管道,并很快意识到我实际上是在构建一个抽象语法树解析器

          那时我意识到这是对轻量级、基于 s 表达式的小型语言的需求。因此我实现了可嵌入的schemy解释器。

          我放了一个示例命令处理应用程序here,它抓住了我上面提到的 Web 服务器设计理念的精髓。它是这样工作的:

          1. 它扩展了嵌入式 Schemay 解释器,实现了一些功能 在 C# 中。

          2. 它找到.ss 脚本,该脚本通过使用定义命令处理管道 那些实现的功能。

          3. 服务器通过 寻找符号EXECUTE,它的类型应该是Func<object, object>

          4. 当一个命令请求进来时,它只是简单地调用相应的 命令处理器(由EXECUTE 定义的处理器),并以 结果。

          最后,这是一个复杂的示例脚本,它通过这个 TCP 命令服务器提供在线手册页查找:

          ; This script will be load by the server as command `man`. The command
          ; is consistent of the following functions chained together:
          ;
          ; 1.  An online man-page look up - it detects the current operating system and 
          ;     decides to use either a linux or freebsd man page web API for the look up.
          ; 
          ; 2.  A string truncator `truncate-string` - it truncates the input string, in
          ;     this case the output of the man-page lookup, to the specified number of
          ;     characters.
          ; 
          ; The client of the command server connects via raw RCP protocol, and can issue
          ; commands like:
          ; 
          ;     man ls
          ; 
          ; and gets response of the truncated corresponding online manpage content.
          
          (define EXECUTE
            (let ((os (get-current-os))
                  (max-length 500))
              (chain                                      ; chain functions together
                (cond                                     ; pick a manpage lookup based on OS
                  ((equal? os "freebsd") (man-freebsd))
                  ((equal? os "linux") (man-linux))
                  (else (man-freebsd)))
                (truncate-string max-length))))           ; truncate output string to a max length
          

          通过命令服务器加载此脚本,TCP 客户端可以向服务器发出命令man <unix_command>

          $ ncat 127.0.0.1 8080
          
          man ls
          
          LS(1)                   FreeBSD General Commands Manual                  LS(1)
          
          NAME
               ls -- list directory contents
          
          SYNOPSIS
               ls [--libxo] [-ABCFGHILPRSTUWZabcdfghiklmnopqrstuwxy1,] [-D format]
                  [file ...]
          
          DESCRIPTION
               For each operand that names a file of a type other than directory, ls
               displays its name as well as any requested, associated information.  For
               each operand that names a file of type directory, ls displays the names
               of files contained within that directory, as well as any requested,
          

          【讨论】:

          • 您是否发现将这种逻辑分解到您解析的脚本中比使用您调用的接口定义插件架构更好?多年来,我一直在与具有类似管道结构的应用程序搏斗,我希望允许沿管道进行处理以使用代码进行配置,因为用静态配置来描述它太难了。但是除了委托用户编写的代码之外,我找不到这样做的好方法。但如果这样做,为什么不创建一个 IUserOverride 接口并让他们使用他们想要的任何语言进行编码?
          • 换句话说,要求你的用户编写 LISP 来与你的 C# 应用程序交互似乎比要求他们用他们选择的 .NET 语言编写更高的期望,而且也不是更灵活,如果整个程序将被加载和执行。我一直在尝试解决这个问题很长时间没有找到一个很好的平衡。
          【解决方案6】:

          也许你应该看看 L#。我不知道它是否是您正在寻找的东西(自大学以来就没有接触过 Lisp),但它可能值得一试。

          http://www.lsharp.org/

          【讨论】:

            【解决方案7】:

            还有DotLisp

            【讨论】:

              猜你喜欢
              • 2022-10-24
              • 1970-01-01
              • 1970-01-01
              • 2015-10-16
              • 2014-09-03
              • 2015-05-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多