Utiliser Lisp en C #

Comme beaucoup de personnes l’ont souligné dans cette question , Lisp est principalement utilisé comme expérience d’apprentissage. Néanmoins, ce serait formidable si je pouvais utiliser mes algorithmes Lisp et les combiner avec mes programmes C #. Au collège, mes profs ne pourraient jamais me dire comment utiliser mes routines Lisp dans un programme (non, ne pas écrire d’interface graphique dans Lisp, merci) Alors, comment puis-je?

    Essayez ces implémentations .Net de Lisp:

    • IronScheme

    IronScheme visera à être une implémentation Scheme conforme à R6RS basée sur le DLR Microsoft.

    • L Sharp .NET

    L Sharp .NET est un puissant langage de script de type Lisp pour .NET. Il utilise un dialecte Lisp similaire à Arc, mais s’intègre étroitement au .NET Framework, qui fournit un riche ensemble de bibliothèques.

    Clojure est un Lisp-1 compilé à la volée en bytecode Java, ce qui permet de très bonnes performances d’exécution. Vous pouvez utiliser Clojure et le comstackr de manière croisée dans un assemblage .NET à l’aide de l’ ikvmc d’IKVM. Bien sûr, lorsqu’il est utilisé dans .NET, Clojure génère volontiers .NET IL, ce qui permet d’obtenir les mêmes performances en termes de code compilé que celles que vous pouvez attendre lorsque vous les utilisez sur une machine virtuelle.

    Si ce sont simplement les routines que vous voulez utiliser, vous pouvez essayer LSharp, ce qui vous permet d’avoir des expressions Lisp dans .NET:

    http://www.lsharp.org/

    L’inverse (en utilisant .NET à partir de Lisp) serait RDNZL:

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

    Le Kit de développement .Net 1.1 contient un exemple de compilateur LISP. Voir SDK \ v1.1 \ Guide du développeur d’outils \ Samples \ clisp

    Je sais que c’est une très vieille question. Mais je vais essayer de fournir une réponse à partir de ma propre expérience et de ma perspective.

    Pour ceux qui, comme nous, aiment la pureté, l’élégance et la simplicité de Scheme / Lisp, j’espère que cela vous donnera des encouragements et de l’inspiration pour savoir comment ils peuvent être très utiles dans une production réelle 🙂

    J’ai récemment ouvert un interprète de type Scheme , appelé schemy , écrit en C # (~ 1500 lignes de code). Et voici la motivation et son utilité –

    Sans entrer trop dans les détails, je construisais un serveur API Web, dont la logique de traitement des demandes devait être prête à l’emploi par d’autres développeurs / scientifiques de données. Il y avait une demande claire de séparation des préoccupations ici – le serveur ne se préoccupe pas beaucoup de la logique de traitement des demandes, mais il a besoin de savoir quelles demandes il peut gérer et où trouver et charger la logique pour les gestionnaires.

    Ainsi, au lieu de mettre en œuvre les gestionnaires dans l’application serveur, le serveur fournit uniquement des “blocs” réutilisables qui peuvent être chaînés en fonction de certains critères et de la logique pour former un pipeline , c’est-à-dire des gestionnaires définis via la configuration . Nous avons essayé JSON / XML pour décrire un tel pipeline et nous avons vite compris que je construisais essentiellement un parsingur syntaxique abstrait .

    C’est à ce moment-là que j’ai compris qu’il s’agissait d’une demande pour un petit langage léger, basé sur l’expression s. C’est pourquoi j’ai implémenté l’interprète de schéma intégrable .

    Je mets ici un exemple d’application de gestion des commandes, qui capture l’essence de la philosophie de conception du serveur Web que j’ai mentionné ci-dessus. Cela fonctionne comme suit:

    1. Il étend un interpréteur Schemy intégré à certaines fonctions implémentées en C #.

    2. Il trouve les scripts .ss qui définissent un pipeline de traitement de commandes à l’aide des fonctions implémentées.

    3. Le serveur trouve et conserve le pipeline de composition à partir d’un script en recherchant le symbole EXECUTE qui doit être de type Func .

    4. Lorsqu’une demande de commande arrive, elle appelle simplement le processeur de commande correspondant (celui défini par EXECUTE ) et les réponses avec le résultat.

    Enfin, voici un exemple de script complexe, qui fournit une recherche de page de manuel en ligne via ce serveur de commande 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 ssortingng truncator `truncate-ssortingng` - it truncates the input ssortingng, 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-ssortingng max-length)))) ; truncate output ssortingng to a max length 

    Avec ce script chargé par le serveur de commandes, un client TCP peut envoyer des commandes man au serveur:

     $ 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, 

    Peut-être devriez-vous jeter un coup d’œil à L #. Je ne sais pas si c’est ce que vous cherchez (vous n’avez pas touché à Lisp depuis l’université), mais cela pourrait valoir la peine de vérifier.

    http://www.lsharp.org/

    Il y a aussi DotLisp .