2010-12-29 5 views
8

Voglio scrivere un'applicazione Web Lisp solo per divertimento. Ho trovato this question sulle app web Lisp ma tutte le risposte sembrano così complicate. Dopo aver esaminato i collegamenti forniti nelle risposte, le soluzioni sembrano davvero davvero complicate.Il modo più semplice per ottenere un'applicazione web "Hello World" Lisp

Se voglio solo una semplice app web Lisp "ciao mondo", non c'è un modo semplice per farlo?

+1

Cosa Lisp? Schema, Common Lisp, Clojure? L'ultimo ha un buon framework web chiamato [Compojure] (https://github.com/weavejester/compojure) (vedi README per un brevissimo esempio di utilizzo). – ffriend

+0

Suppongo che non sia terribilmente particolare ma Common Lisp è quello che ho usato in passato. –

risposta

6

Questa risposta sembra complicata, ma penso che ottenere una semplice applicazione web Lisp sia funzionante sarà più facile che imparare gli altri pezzi più fantastici di Lisp in ogni caso, quindi probabilmente ne vale la pena.

Ci sono un paio di fantastici libri Common Lisp con i capitoli di intro-to-web-app: Practical Common Lisp e Land of Lisp.

C'è un capitolo in Land of Lisp che copre la costruzione di un semplice server Web che utilizza socket. È piuttosto rudimentale, ma penso che sarebbe un ottimo punto di partenza per un tipo di app Lisp "ciao mondo".

Il capitolo in Practical Common Lisp è a un livello superiore e funziona con un server a tutti gli effetti chiamato Allegro Serve. Ci sono capitoli successivi che costruiscono un'app di streaming MP3.

Practical Common Lisp è disponibile gratuitamente, ecco il capitolo di interesse: http://gigamonkeys.com/book/practical-web-programming-with-allegroserve.html

Credo che entrambi i libri sono grandi risorse per l'avvio con Common Lisp (come qualcuno che è appena agli inizi me stesso), anche se Land of Lisp è un po 'più accessibile e più divertente, anche se copre alcuni problemi interessanti come la valutazione pigra e la ricerca di alberi di gioco. Pratic Common Lisp è più ... pratico, ma non è proprio una brutta cosa. È rivolto a programmatori professionisti quindi il suo tono è solo un po 'più serio.

Una parola di avvertimento:

per quanto ne so Common Lisp non ha un modo standard di fare davvero la programmazione di rete, quindi questo è un settore di apprendimento Lisp dove si inizia a correre in problemi se non si sceglie la stessa implementazione del libro che stai leggendo.

Land of Lisp utilizza CLISP in tutto, ma è possibile utilizzare SBCL se si segue insieme a questo post del blog vicina: http://blog.ciaranbradley.com/crossing-the-streams-land-of-lisp-chapter-12-0

Practical Common Lisp utilizza Allegro Servire come ho detto, e penso che ci sia una versione di Allegro Lisp disponibile dal loro sito per l'uso con il libro. Tuttavia, è anche possibile utilizzare Portable Allegro Serve.Fai attenzione se stai usando Mac OS X e SBCL (come me lo sono): il supporto del thread di SBCL è sperimentale su OS X, quindi se segui questa strada, la soluzione migliore è installare Ubuntu in una VM e poi apt-get install sbcl e fare il tuo Allegro Servire la programmazione lì, dove i thread SBCL sono meglio supportati. Forse alcuni maghi del CL possono suggerire qualche altro consiglio qui. Questo è quello che ha funzionato per me.

2

PLT Racket è un dialetto Scheme molto completo che può farlo. Hanno un semplice tutorial here in cui sviluppano un piccolo CMS e alcune discussioni su un server web Racket here. Se fossi in te, ci proverei. Il loro "ciao mondo" assomiglia a questo:

(define (start request) 
'(html 
    (head (title "My Blog")) 
    (body (h1 "Under construction")))) 

Vedere, non è così male!

(Se Clojure conta come Lisp, naturalmente, ci sono diversi framework per applicazioni web in vari stati di sviluppo per esso pure.)

1

Here è un recente articolo sulla costruzione di una semplice webapp in Common Lisp.

0

Ecco uno blog post che configura SBCL e Hunchentoot per servire una pagina ciao-mondo.

Non dirò che è il modo migliore per creare un'app Web ma è piuttosto semplice.

0

Beh, non sono completamente sicuro di cosa intendi per "web app". Quando incrocio un sito dinamico, di solito lavoro in una mentalità CGI. Ecco un link a una configurazione CGI per Common Lisp http://www.cl-user.net/asp/jf8v/sdataQvStnw8XWwrFDQ3xCR8X8yBX8yBXnMq=/sdataQu3F $ sSHnB ==

Per una ragione che non ne sono ancora sicuro di, più lavoro web Lisp sembra centrare attorno ad un web server integrato in Lisp, invece di avere Apache o IIS chiama nel software Lisp per analizzare il file .lisp.

+0

Sì, non capisco neanche questo. Perché non usare Apache? –

+1

La maggior parte dei Lisps, in particolare le implementazioni Common Lisp, sono basate su immagini e compilate.Caricare l'immagine, compilare il codice e collegarlo all'immagine non è qualcosa che dovrebbe essere fatto per ogni richiesta. E poiché è necessario comunque un processo persistente, potrebbe anche essere un server Web che può essere utilizzato come proxy per utilizzare le funzionalità standard. – Ramarren

6

Per CL-HTTP si potrebbe caricare il server in Lisp e fare:

(defun hello-world (url stream) 
    (http:with-successful-response (stream :text) 
    (princ "hello world" stream))) 

Sopra è una funzione risposta. La funzione di risposta ha due argomenti: un URL e uno stream. La funzione di risposta aggiunge le solite intestazioni di risposta e dice che restituisce "testo". All'interno di questo stampiamo semplicemente una stringa sul flusso di output.

(http:export-url #u"/hello-world" 
       :computed 
       :response-function 'hello-world) 

Sopra esporta un URL che si è fusa con il contesto predefinito (il nome del server predefinito e la porta). #u è una macro di lettura per creare oggetti URL. L'URL viene esportato come: COMPUTATO e quindi ha bisogno di: RESPONSE-FUNCTION per calcolare la risposta. Passiamo nella funzione che abbiamo definito sopra.

Quando un client invia una richiesta GET con l'URL a questo server, chiama la funzione di risposta per tale URL e fornisce un flusso di output.

che quindi genera questo contenuto:

CL-USER 4 > (http:show-raw-url #u"/hello-world") 

Status Code: 200 (OK) 
Server Version: http/1.1 
Date: Wed, 29 Dec 2010 23:39:52 GMT 
Server: CL-HTTP/70.218 (LispWorks; 2.1.8) 
Content-Type: text/plain; charset=ISO-8859-1 
Transfer-Encoding: chunked 

hello world 

Questo è tutto.

1

Un semplice mondo Hello dovrebbe essere con hunchentoot e cl-who.

(defparameter *httpd* 
    (hunchentoot:start 
    (make-instance 'hunchentoot:acceptor 
        :port 8080))) 
(princ "Hunchentoot started on port ") 
(princ *httpd-port*) 
(terpri) 

(hunchentoot:define-easy-handler (hello-world (:uri "/hello")) 
    () 
    (with-html-output (*standard-output* nil :indent t) 
     (:html 
       (:head 
       (:title "Hello World")) 
       (:body 
       (:p "Hello world!..."))))) 

Per maggiori informazioni: http://weitz.de/hunchentoot/, http://zaries.wordpress.com/2010/11/09/lisp-web-server-from-scratch-using-hunchentoot-and-nginx/

Per installare hunchentoot, utilizzare quicklisp (è il più facile).

(ql:quickload :hunchentoot)