【发布时间】:2008-09-16 07:13:03
【问题描述】:
正如this question 中很多人指出的那样,Lisp 主要用作学习体验。尽管如此,如果我能以某种方式使用我的 Lisp 算法并将它们与我的 C# 程序结合起来,那就太好了。 在大学里,我的教授永远不会告诉我如何在程序中使用我的 Lisp 例程(不,不是用 Lisp 编写 GUI,谢谢)。 那我该怎么办?
【问题讨论】:
正如this question 中很多人指出的那样,Lisp 主要用作学习体验。尽管如此,如果我能以某种方式使用我的 Lisp 算法并将它们与我的 C# 程序结合起来,那就太好了。 在大学里,我的教授永远不会告诉我如何在程序中使用我的 Lisp 例程(不,不是用 Lisp 编写 GUI,谢谢)。 那我该怎么办?
【问题讨论】:
试试 Lisp 的这些 .Net 实现:
IronScheme 的目标是成为 R6RS 符合方案实施为基础 在 Microsoft DLR 上。
L Sharp .NET 是一个强大的类 Lisp .NET 的脚本语言。它使用一个 Lisp 方言类似于 Arc 但 与 .NET 紧密集成 提供丰富的框架 图书馆。
【讨论】:
如果它只是您想使用的例程,您可以尝试 LSharp,它可以让您在 .NET 中使用 Lisp 表达式:
另一种方式(使用 Lisp 中的 .NET)将是 RDNZL:
【讨论】:
.Net 1.1 SDK 包含一个 LISP 编译器示例。见 SDK\v1.1\Tool 开发者指南\Samples\clisp
【讨论】:
我知道这是一个非常古老的问题。但我会尝试从我自己的经验和角度来提供答案。
对于像我们这样喜欢 Scheme/Lisp 的纯粹、优雅和简单的人,我希望这能给你一些鼓励和启发,让它们在实际生产中非常有用:)
我最近从名为schemy 的工作中开源了一个类似于 Scheme 的解释器,它是用 C# 编写的(大约 1500 行代码)。这是动机以及它的用处 -
没有过多的细节,我正在构建一个 Web API 服务器,其他开发人员/数据科学家希望其请求处理逻辑是即插即用的。这里有一个明确的关注点分离需求 - 服务器不太关心请求处理逻辑,但它需要知道它可以处理哪些请求以及在哪里找到和加载逻辑处理程序。
因此,服务器并没有将处理程序实现放在服务器应用程序中,而是仅提供可重用的“块”,这些“块”可以根据某些标准和逻辑链接在一起以形成 管道,即处理程序通过配置定义。我们尝试使用 JSON/XML 来描述这样的管道,并很快意识到我实际上是在构建一个抽象语法树解析器。
那时我意识到这是对轻量级、基于 s 表达式的小型语言的需求。因此我实现了可嵌入的schemy解释器。
我放了一个示例命令处理应用程序here,它抓住了我上面提到的 Web 服务器设计理念的精髓。它是这样工作的:
它扩展了嵌入式 Schemay 解释器,实现了一些功能 在 C# 中。
它找到.ss 脚本,该脚本通过使用定义命令处理管道
那些实现的功能。
服务器通过
寻找符号EXECUTE,它的类型应该是Func<object, object>。
当一个命令请求进来时,它只是简单地调用相应的
命令处理器(由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,
【讨论】:
也许你应该看看 L#。我不知道它是否是您正在寻找的东西(自大学以来就没有接触过 Lisp),但它可能值得一试。
【讨论】:
还有DotLisp。
【讨论】: