Я знаю, что это действительно старый вопрос. Но я постараюсь дать ответ исходя из собственного опыта и перспективы.
Для таких, как мы, которые любят чистоту, элегантность и простоту Схемы / Лиспа, я надеюсь, что это даст вам некоторое вдохновение и вдохновение, как они могут быть очень полезны в реальном производстве:)
Недавно я открыл интерпретатор, подобный Scheme, из работы под названием schemy , написанной на C # (~ 1500 строк кода). А вот и мотивация и как она полезна -
Не вдаваясь в подробности, я строил сервер веб-API, логика обработки запросов которого должна быть подключена и работать другими разработчиками / исследователями данных. Здесь возникла явная потребность в разделении проблем - сервер не очень заботится о логике обработки запросов, но ему нужно знать, какие запросы он может обрабатывать и где найти, и загрузить логику для обработчиков. ,
Таким образом, вместо помещения реализации обработчиков в серверное приложение, сервер предоставляет только повторно используемые «блоки», которые могут быть объединены в цепочку на основе некоторых критериев и логики для формирования конвейера , то есть определенных обработчиков. через конфигурация . Мы попробовали JSON / XML описать такой конвейер и быстро поняли, что я по сути строил синтаксический анализатор абстрактного дерева .
Это было тогда, когда я понял, что это был спрос на легкий, основанный на s-выражениях маленький язык. Поэтому я реализовал встраиваемый интерпретатор schemy .
Я поместил пример приложения для обработки команд здесь , которое отражает суть философии проектирования веб-сервера, о которой я упоминал выше. Это работает так:
Расширяет встроенный интерпретатор Schemy с некоторыми реализованными функциями
в 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,