Использование Lisp в C # - PullRequest
       53

Использование Lisp в C #

11 голосов
/ 16 сентября 2008

Как многие люди указывали в на этот вопрос , Лисп в основном используется как учебный опыт. Тем не менее, было бы здорово, если бы я мог каким-то образом использовать свои алгоритмы на Лиспе и комбинировать их с моими программами на C #. В колледже мои профессионалы никогда не могли мне сказать, как использовать мои подпрограммы на Лиспе в программе (нет, спасибо, не пишу графический интерфейс на Лиспе). Так как я могу?

Ответы [ 7 ]

13 голосов
/ 16 сентября 2008

Попробуйте эти .Net реализации Lisp:

IronScheme будет стремиться стать R6RS Соответствующая Схема реализации на основе на Microsoft DLR.

L Sharp .NET - мощный Лисп-подобный язык сценариев для .NET. Он использует Диалект Lisp похож на Arc, но тесно интегрируется с .NET Framework, который обеспечивает богатый набор библиотеки.

10 голосов
/ 16 сентября 2008

Clojure - это Lisp-1, который скомпилирован на лету для байт-кода Java, что приводит к очень хорошей производительности во время выполнения. Вы можете использовать Clojure и кросс-компилировать его в сборку .NET, используя IKVM ikvmc. Конечно, при использовании в .NET Clojure успешно генерирует .NET IL, что приводит к той же производительности компилируемого кода, которую можно ожидать при использовании его в JVM.

3 голосов
/ 02 апреля 2018

Я знаю, что это действительно старый вопрос. Но я постараюсь дать ответ исходя из собственного опыта и перспективы.

Для таких, как мы, которые любят чистоту, элегантность и простоту Схемы / Лиспа, я надеюсь, что это даст вам некоторое вдохновение и вдохновение, как они могут быть очень полезны в реальном производстве:)

Недавно я открыл интерпретатор, подобный Scheme, из работы под названием schemy , написанной на C # (~ 1500 строк кода). А вот и мотивация и как она полезна -

Не вдаваясь в подробности, я строил сервер веб-API, логика обработки запросов которого должна быть подключена и работать другими разработчиками / исследователями данных. Здесь возникла явная потребность в разделении проблем - сервер не очень заботится о логике обработки запросов, но ему нужно знать, какие запросы он может обрабатывать и где найти, и загрузить логику для обработчиков. ,

Таким образом, вместо помещения реализации обработчиков в серверное приложение, сервер предоставляет только повторно используемые «блоки», которые могут быть объединены в цепочку на основе некоторых критериев и логики для формирования конвейера , то есть определенных обработчиков. через конфигурация . Мы попробовали JSON / XML описать такой конвейер и быстро поняли, что я по сути строил синтаксический анализатор абстрактного дерева .

Это было тогда, когда я понял, что это был спрос на легкий, основанный на s-выражениях маленький язык. Поэтому я реализовал встраиваемый интерпретатор schemy .

Я поместил пример приложения для обработки команд здесь , которое отражает суть философии проектирования веб-сервера, о которой я упоминал выше. Это работает так:

  1. Расширяет встроенный интерпретатор Schemy с некоторыми реализованными функциями в 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,
3 голосов
/ 16 сентября 2008

.Net 1.1 SDK содержит пример компилятора LISP. См. SDK \ v1.1 \ Руководство для разработчиков инструментов \ Samples \ clisp

3 голосов
/ 16 сентября 2008

Если вы хотите использовать только подпрограммы, вы можете попробовать LSharp, который позволяет вам иметь выражения Lisp в .NET:

http://www.lsharp.org/

Другим способом (с использованием .NET из Lisp) будет RDNZL:

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

2 голосов
/ 18 марта 2010

Существует также DotLisp .

2 голосов
/ 16 сентября 2008

Возможно, вам стоит взглянуть на L #. Я не знаю, если это то, что вы ищете (не трогали Лисп с университета), но, возможно, стоит проверить.

http://www.lsharp.org/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...