Vraag Lisp gebruiken in C #


Zoals veel mensen erop wezen deze vraag, Lisp wordt meestal gebruikt als een leerervaring. Niettemin zou het geweldig zijn als ik op de een of andere manier mijn Lisp-algoritmen zou kunnen gebruiken en ze zou kunnen combineren met mijn C # -programma's. Op de universiteit konden mijn profs mij nooit vertellen hoe ik mijn Lisp-routines in een programma moest gebruiken (nee, ik schreef geen GUI in Lisp, dank u). Dus hoe kan ik?


11
2017-09-16 07:13


oorsprong


antwoorden:


Probeer deze .Net-implementaties van Lisp:

IronScheme streeft ernaar een R6RS te zijn   conforme implementatie van de Scheme   op de Microsoft DLR.

L Sharp .NET is een krachtige Lisp-achtige   scripttaal voor .NET. Het gebruikt een   Lisp dialect vergelijkbaar met Arc maar   sluit nauw aan op .NET   Framework dat een rijke verzameling biedt   bibliotheken.


13
2017-09-16 07:19



Clojure is een Lisp-1 dat is gecompileerd on-the-fly naar Java bytecode, wat leidt tot zeer goede runtime-prestaties. U kunt Clojure gebruiken en het compileren met een .NET-assembly met iKVM's ikvmc. Natuurlijk, wanneer gebruikt in .NET, genereert Clojure gelukkig .NET IL, wat leidt tot dezelfde soort gecompileerde code die u kunt verwachten wanneer u het op een JVM gebruikt.


10
2017-09-16 11:31



Als het alleen de routines zijn die u wilt gebruiken, kunt u LSharp proberen, waarmee u Lisp-expressies in .NET kunt gebruiken:

http://www.lsharp.org/

Andersom (met .NET van Lisp) zou RDNZL zijn:

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


3
2017-09-16 07:21



De .Net 1.1 SDK bevat een LISP-compiler-voorbeeld. Zie handleiding SDK \ v1.1 \ Tool Developers \ Samples \ clisp


3
2017-09-16 07:22



Misschien moet je eens kijken naar L #. Ik weet niet of dit is wat u zoekt (ik heb sinds de universiteit Lisp niet aangeraakt), maar het kan de moeite waard zijn om uit te checken.

http://www.lsharp.org/


2
2017-09-16 07:22



Er is ook DotLisp.


2
2018-03-18 14:22



Ik weet dat dit een heel oude vraag is. Maar ik zal proberen een antwoord te geven vanuit mijn eigen ervaring en perspectief.

Voor degenen zoals wij die houden van de zuiverheid en elegantie en eenvoud van Scheme / Lisp, ik hoop dat dit je enige aanmoediging en inspiratie geeft, hoe ze heel nuttig kunnen zijn in de echte productie :)

Ik heb onlangs een Scheme-achtige tolk uit werk genaamd Open-sourced schemy, geschreven in C # (~ 1500 regels code). En hier is de motivatie en hoe het nuttig is -

Zonder al te veel in detail te treden, bouwde ik een web API-server, waarvan de logica voor het afhandelen van aanvragen gewenst is om plug-and-play te zijn van andere ontwikkelaars / data-wetenschappers. Er was een duidelijke vraag naar scheiding van zorg hier: de server geeft niet veel om de logica voor het afhandelen van aanvragen, maar hij moet weten welke verzoeken het kan verwerken en waar te vinden en laden de logica voor de handlers.

Dus in plaats van de implementatie van handlers in de servertoepassing te plaatsen, biedt de server alleen herbruikbare 'blokken' die aan elkaar kunnen worden geketend op basis van een aantal criteria en logica om een pijpleiding, d.w.z. handlers gedefinieerd via configuratie. We hebben JSON / XML geprobeerd om zo'n pijplijn te beschrijven en dat hebben we snel begrepen Ik bouwde in essentie een abstracte syntaxisboomparser.

Dit was toen ik me realiseerde dat dit een vraag naar een lichtgewicht, s-expressie gebaseerde kleine taal was. Daarom heb ik de embed embed geïmplementeerd schemy tolk.

Ik heb een voorbeeldopdracht voor het afhandelen van opdrachten gegeven hier, dat de essentie van de ontwerpfilosofie voor de webserver die ik hierboven noemde vastlegt. Het werkt als volgt:

  1. Het breidt een ingesloten Schemy-interpreter uit met enkele geïmplementeerde functies in C #.

  2. Het vindt .ss scripts die een commandoverwerkingspijplijn definiëren met behulp van die geïmplementeerde functies.

  3. De server vindt en houdt de samengestelde pijplijn vast van een script van op zoek naar het symbool EXECUTE welke van het type zou moeten zijn Func<object, object>.

  4. Wanneer een opdrachtverzoek binnenkomt, roept dit eenvoudigweg het corresponderende op opdrachtprocessor (degene die is gedefinieerd door EXECUTE) en antwoorden met de resultaat.

Ten slotte is hier een complex voorbeeldscript, dat een online opzoeking op basis van de menspagina biedt via deze TCP-opdrachtserver:

; 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

Met dit script geladen door de opdrachtserver, kan een TCP-client opdrachten geven man <unix_command> naar de server:

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

2
2018-04-02 19:03