Wie kann ich mit Lisp oder Scheme Webprogrammierung durchführen?

78

Normalerweise schreibe ich Web-Apps in PHP, Ruby oder Perl. Ich beginne mit dem Studium des Schemas und möchte ein Webprojekt mit dieser Sprache ausprobieren. Aber ich kann nicht finden, was die beste Umgebung dafür ist.

Ich suche folgende Funktionen:

  • Eine einfache Möglichkeit, die Anforderungsparameter abzurufen (z. B. get-get #key, get-post #key, get-cookie #key).
  • MySQL-Zugang.
  • HTML-Formulargeneratoren, -verarbeitung, -validatoren usw.
  • Helfer zum Filtern von Benutzereingabedaten (z. B. HTML-Entitäten, Escape-Variablen zum Einfügen von Abfragen usw.).
  • ZAHNSEIDE.
  • Und GNU / Linux freundlich.

Also, danke im Voraus an alle Antworten.

Castro
quelle
1
Dinge wie HTML-Funktionen, Escape-Funktionen, Wrapper für Anforderungen usw. könnten eine gute Übung für Sie sein, um sich in Scheme zu implementieren, da Sie sagen, dass Sie gerade erst mit dem Lernschema beginnen.
Erjiang

Antworten:

73

Schläger hat alles was Sie brauchen. Weitere Informationen finden Sie im Tutorial zum Racket-Webserver und anschließend in der Dokumentation . Der Webserver gibt es schon eine Weile und er hat viele Funktionen. Wahrscheinlich ist das einzige, was nicht enthalten ist, eine MySQL-Schnittstelle, die jedoch als Paket auf PLaneT (Racket Package Distribution Tool) vorhanden ist.

UPDATE: Racket bietet jetzt DB-Unterstützung und funktioniert mit mehreren DBs, einschließlich MySQL.

Eli Barzilay
quelle
1
Abgeordnet. Die Fortsetzungsoberfläche ist ebenfalls interessant - machen Sie sich keine Sorgen, wenn sie verwirrend aussieht. Der Rest der Servlet-Schnittstelle funktioniert immer noch ohne. War mir der MySQL-Oberfläche nicht bewusst, ich werde das überprüfen, danke!
Aaron
1
Seit '09 hat Racket integrierte Datenbankunterstützung. Es gibt Unterstützung für PostgreSQL, MySQL, SQLite und ODBS. Siehe docs.racket-lang.org/db/index.html
Soegaard
19

Vielleicht möchten Sie einen Blick auf Clojure werfen :

Clojure ist eine dynamische Programmiersprache, die auf die Java Virtual Machine abzielt. [...] Clojure bietet einfachen Zugriff auf die Java-Frameworks mit optionalen Typhinweisen und Typinferenz, um sicherzustellen, dass Aufrufe von Java Reflexionen vermeiden können.

Clojure ist ein Dialekt von Lisp und teilt mit Lisp die Code-as-Data-Philosophie und ein leistungsfähiges Makrosystem.

Die Interaktion mit Java ist in Clojure unkompliziert, sodass Sie alle vorhandenen Java-Bibliotheken nach Bedarf wiederverwenden können. Ich bin sicher, es gibt viele, die für die Webentwicklung nützlich sind.

clojure-contrib verfügt über eine SQL-API, und es gibt auch ClojureQL , das Ihre DB-Zugriffsanforderungen abdecken sollte.

Für Clojure befindet sich ein Webframework namens Compojure in der Entwicklung. Es kann auch andere geben.

Clojures Quelle ist auf Github unter der EPL verfügbar . Es ist einfach, es unter Linux zum Laufen zu bringen. Ich klone einfach die Git-Repos und renne los ant.

Mike Mazur
quelle
Danke für die Antwort. Ich habe keine Erfahrung mit Java. Ist eine Voraussetzung für die Einrichtung oder Verwendung von Clojure?
Castro
1
Ich denke nicht, dass Java eine Voraussetzung ist; Sie werden in der Lage sein, mit Clojure ganz gut zu beginnen.
Mike Mazur
1
Clojure läuft auf einer JVM, daher muss eine installiert sein. Erfahrung mit der Java-Klassenbibliothek ist definitiv von Vorteil, wenn Sie sich nicht mehr mit den integrierten Typen von Clojure befassen.
wm_eddie
18

Sie können Webentwicklung mit Guile-Schema durchführen . Die Standardbibliothek enthält das (sxml simple) Modul, das für die HTML-Generierung, Manipulation und Analyse sehr nützlich ist. Die guile-www - Bibliothek bietet Unterstützung für http, cgi usw. Die guile-dbi- Bibliothek bietet Zugriff auf MySQL und andere Datenbanken. Mit diesen Bausteinen können Sie alles implementieren, von einfachen CGI-Skripten bis hin zu Webanwendungen mit einem eigenen HTTP-Server.

gcbenison
quelle
10

Ich habe ein ziemlich umfangreiches Tutorial / E-Book zum Thema geschrieben: http://lispwebtales.ppenev.com/

Kurze Zusammenfassung:

  • Es verwendet Common Lisp
  • Es verwendet das Restas- Framework
  • Es enthält Beispiele für die meisten grundlegenden Webentwicklungen, einschließlich DB-Zugriff, Authentifizierung, HTML-Generierung und Vorlagen.
  • Da die Restas-Dokumentation ziemlich veraltet ist, kommt mein Tutorial den aktuellen Dokumenten am nächsten.
  • Zeigt einige der erweiterten Funktionen, wie z. B. Richtlinien, mit denen Sie steckbare Schnittstellen schreiben können, z. B. können Sie eine Datenspeicherschicht schreiben und Backends für verschiedene Speichermechanismen relativ einfach schreiben, das Modulsystem, mit dem Sie dies tun können Schreiben Sie wiederverwendbare Komponenten wie Auth-Frameworks und ähnliches.
  • Es behandelt Dinge wie die Installation von lisp, das Einrichten des ASDF-Build-Systems und des quicklisp-Paketmanagers usw.
  • Es ist kostenlos online und sobald ich fertig bin, wird es auch auf Leanpub kostenlos sein. Die Quelle befindet sich unter https://github.com/pvlpenev/lispwebtales unter einer CC-Lizenz. Der Quellcode lautet MIT. Es ist noch nicht alles veröffentlicht, und ich bin gerade dabei, es zu überarbeiten.
Pavel Penev
quelle
8

Wenn Sie genau an Common Lisp interessiert sind und nicht die Weblock-Route einschlagen möchten, würde ich das folgende Setup empfehlen:

  1. Verwenden Sie SBCL unter Linux, jedoch mit Unterstützung für mehrere Threads
  2. Verwenden Sie Hunchentoot als Webserver, der Ihnen die gesamte erforderliche Serververarbeitung einschließlich Sitzungen und Cookies bietet
  3. Verwenden Sie ClSql, um mit MySql zu kommunizieren. Es verfügt über eine umfangreiche Dokumentation und ist sehr stabil.
  4. Für die HTMl-Generation können Sie Dr. Edi Weitz Cl-WHO verwenden (sehr gut dokumentiert).

Beachten Sie, dass alle oben genannten Lizenzen unter GPL oder einer ähnlichen Lizenz stehen (eine, die eher für Lisp-Programme geeignet ist).

Mackram
quelle
6

Gambit Scheme hat auch eine eigene Lösung für Web-Apps. Es verwendet das Spork- Framework, das auf dem Black Hole- Modulsystem basiert (beide von Per Eckerdal).

Andrew Whaley hat ein erstes Tutorial, wie man Gambit, Black Hole und Spork dazu bringt, eine Web-App unter Apache mit mod_proxy auszuführen. Vielleicht möchten Sie sich das ansehen.

In einem (möglicherweise) verwandten Zusammenhang kompiliert Gambit Ihre Inhalte auch zu C und dann zu einer ausführbaren Datei, wenn Sie dies wünschen.

Malvim
quelle
5

Paul Graham (und seine Freunde) haben einen Lisp-Dialekt speziell für das Schreiben grundlegender Webanwendungen erstellt. Es heißt Arc und ist unter arclanguage.org erhältlich .

Es ist wahrscheinlich nicht für wirklich große, komplexe Websites geeignet und ich bin mir nicht sicher, in welchem ​​Zustand sich die Datenbankunterstützung befindet, aber Paul Graham weiß, wie man Webanwendungen in Lisp schreibt , sodass Arc Ihnen den HTTP / HTML-Teil einfach macht, während Sie am meisten Geld ausgeben von Ihren Gehirnzyklen lernen den lisp Weg.

wm_eddie
quelle
3

Weblocks ist ein schönes Tool zum Erstellen von Web-Apps in Common Lisp, aber etwas zu schwer für mich.

Wir verwenden den folgenden Stapel:

  • OpenMCL (Open Source Lisp, sehr schön)

  • Portable Allegroserve (Webserver, HTML-Generator)

  • Unsere eigenen Rails-ähnlichen Tools für Ajaxy-Inhalte (Update: Dies wurde jetzt als WuWei als Open-Source-Version bereitgestellt )

  • Eine Vielzahl von CL-Bibliotheken wie cl-json, cl-smtp, md5
mtraven
quelle
2

Ich verwende meine eigene, angepasste Version von Scheme, die von MzScheme abgeleitet ist. Es verfügt über ein neues, einfaches Webanwendungsframework, einen integrierten Webserver (nicht den mit MzScheme gelieferten) und ODBC-Bibliotheken. ( http://spark-scheme.wikispot.org/Web_applications ). Die Dokumentation ist möglicherweise nicht vollständig, da dies eher ein persönliches Werkzeug ist. Es gibt jedoch viele Beispielcodes im Code-Repository .

Vijay Mathew
quelle
2

Clojure ist ein Lisp-Dialekt, der Sie interessieren könnte. Zu diesem Zeitpunkt gibt es einen ziemlich anständigen Webentwicklungsstapel. Ich kann ein paar Dinge empfehlen:

  • Der leiningenAbhängigkeitsmanager, mit dem Sie arbeiten, ist wirklich einfach zu installieren und zu verwalten. Ziemlich schöne Plugins auch dafür. Es gibt sogar ein Plugin für Clojurescript, eine auf Clojure basierende Sprache, die in Javascript kompiliert wird.
  • Die ringHTTP-Server-Abstraktion. Es wird in den meisten aktuellen Web-Frameworks verwendet. Es ist eine ziemlich gute Idee, dies zuerst zu lernen, bevor Sie in ein tatsächliches Framework springen.
  • hiccupist eine in Clojure geschriebene HTML-DSL- / Template-Sprache. Es ist sehr ausdrucksstark! Erinnert mich in gewissem Sinne ein bisschen an Jade.
  • composuremüsste das beliebteste Webframework für Clojure sein. Es ist im Wesentlichen eine Routing-Bibliothek wie express.js.
Jonathan Boudreau
quelle
2

Mal sehen, was mit Common Lisp gemacht werden kann .

Der Zustand des Common Lisp-Ökosystems (2015) und die Awesome Common Lisp- Liste zeigen uns einige moderne Frameworks ( Caveman , Luzern , alle auf dem neuen Clack- Webanwendungsserver, einer Schnittstelle für Hunchentoot und andere Server). Lassen Sie uns mit unseren eigenen Erkenntnissen diskutieren.

Update 2019 : Es gibt ein neues Tutorial zum Common Lisp Cookbook: https://lispcookbook.github.io/cl-cookbook/web.html Es behandelt Routing, Template-Engines, das Erstellen eigenständiger Binärdateien, die Bereitstellung usw.

Update : Etwas später fand ich Snooze vom Schöpfer von Sly oder Emacs 'Yasnippet heraus und hatte einen viel besseren Eindruck als Caveman. Das Deklarieren von Endpunkten ähnelt dem Deklarieren von Funktionen. Einige Dinge, die in Caveman mühsam waren, sind in Snooze offensichtlich, z. B. der Zugriff auf die URL-Parameter. Ich habe nicht viel Erfahrung damit, aber ich empfehle es auszuprobieren.

Update Juni 2018 : Verpassen Sie auch nicht das laufende Umschreiben von Weblocks, es wird riesig! : D http://40ants.com/weblocks/quickstart.html Mit Weblocks können dynamische Webanwendungen ohne Javascript-Zeile erstellt werden, ohne dass die Vorder- und Rückseite getrennt werden müssen. Es ist komponentenbasiert, wie React, aber serverseitig. Zum Zeitpunkt des Schreibens (Juni 2018) ist es sehr Alpha, aber im Gange und es funktioniert, ich habe ein paar einfache Web-Apps.

Eine einfache Möglichkeit, die Anforderungsparameter abzurufen (z. B. get-get #key, get-post #key, get-cookie #key).

Ich fand den Luzerner Weg einfacher, er ist so einfach wie ein with-paramsMakro ( Beispiel aus der Praxis ):

@route app (:post "/tweet")
(defview tweet ()
  (if (lucerne-auth:logged-in-p)
      (let ((user (current-user)))
        (with-params (tweet)
          (utweet.models:tweet user tweet))
        (redirect "/"))
      (render-template (+index+)
                       :error "You are not logged in.")))

Cavemans Weg war mir weniger klar .

MySQL-Zugang

Caveman wirbt für die Datenbankintegration (mit Datafly und sxql von Fukamachi).

Sie können einfach clsql oder das Mito ORM verwenden: https://lispcookbook.github.io/cl-cookbook/databases.html

HTML-Formulargeneratoren, -verarbeitung, -validatoren usw.

Ich weiß nicht, ob es da draußen Formulargeneratoren gibt. edit : es gibt:  cl-Formulare und Formlets oder wieder 1forms , die mit Caveman2 arbeiten.

Caveman hat keine (Problem im Jahr 2011).

Helfer zum Filtern von Benutzereingabedaten (z. B. HTML-Entitäten, Escape-Variablen zum Einfügen von Abfragen usw.).

Ratify ist eine Eingabevalidierungsbibliothek, die jedoch nicht in ein Framework integriert ist.

FLOSS und GNU / Linux freundlich: ✓

Andere Web-Sachen

Apropos Web, es gibt andere nette Bibliotheken in CL Land:

  • Webserver: Woo ist ein schneller HTTP-Server, schneller als Nodejs (Vorsicht vor Diagrammen…), Wookie ist ein asynchroner http-Server.
  • Dexador ist ein HTTP-Client
  • Plump , lquery und CLSS erleichtern das Parsen von HTML und das Abfragen des DOM.
  • cl-bootstrap bietet Twitter-Bootstrap-Verknüpfungen für die cl-who- Template-Engine (die Jade / Pug ersetzt, obwohl wir auch übliche Vorlagen haben).

Ajax in Lisp

(Denken Sie daran, mit Weblocks, siehe oben, brauchen wir diese möglicherweise nicht.)

Mit ParenScript können wir JavaScript in Common Lisp schreiben, ohne unseren üblichen Workflow zu leben, und somit die fetchWeb-API zum Schreiben von Ajax-Aufrufen verwenden.

Ehvince
quelle
0

Clojure wäre dafür perfekt. Mit sehr kurzem, sauberem Code können Sie einige sehr komplexe Anwendungen wie Blogs oder Foren implementieren.

Imagist
quelle