2012-04-07 18 views
16

Tôi rất tò mò về việc sử dụng Lisp để củng cố dịch vụ web RESTful hiện đại, nhưng với nhiều biến thể và triển khai, thật khó để biết bắt đầu từ đâu.Dịch vụ web với Lisp

Tôi chắc chắn rằng có những người ngoài đó sử dụng Lisp cho các ứng dụng liên quan đến web (chỉ cần rà soát thông qua các câu hỏi ở đây trên SO cho thấy điều đó) nhưng những gì tôi muốn biết là là có bất kỳ triển khai Lisp nào phù hợp hơn dịch vụ web so với các dịch vụ khác? (hỗ trợ unicode gốc chẳng hạn, các thư viện có liên quan đến web, hiệu suất, v.v.)

Tôi không tìm kiếm các khung "web hack" hoặc khung web unicode. Tôi chủ yếu quan tâm đến những gì bạn nhận được ra khỏi hộp. Tôi đã không liên kết bản thân với bất kỳ Lisp phái sinh hoặc thực hiện, mặc dù tôi có một số kinh nghiệm nhỏ với Common Lisp trên CLISP (một máy tính đa thức chung như một phần của một khóa học khoa học máy tính đại học). Thật tuyệt khi biết nếu có những lựa chọn đặc biệt tốt cho vấn đề này, đặc biệt là từ những người đã thực sự sử dụng Lisp theo cách này.

Trả lời

13

Racket Thư viện chuẩn chứa web server library. Tôi đã chơi với nó, nhưng cảm thấy nó không phù hợp với cách tương tác ưa thích của tôi khi làm việc với một Lisp. Nó có một số tính năng tốt đẹp, như dòng chảy dựa trên điều khiển liên tục, vì vậy nó đáng xem.

Phát biểu từ trải nghiệm cá nhân, Common Lisp là một lựa chọn tuyệt vời để phát triển web. Đó là những gì blog của tôi được triển khai. Hunchentoot rất đơn giản và mạnh mẽ và rất dễ hiểu. Lập trình tương tác được hỗ trợ cũng như có thể được tưởng tượng, và có những plug-in cho những thứ như Websockets (mặc dù tôi chưa cần).

Điều đó nói rằng, lập trình web trong Clojure cũng dễ chịu. Tôi đã triển khai trung tâm cộng đồng dựa trên web cho gia đình mình bằng Clojure và Noir. Stylewise, Noir rất giống với sự kết hợp của Hunchentoot và cl-who. Như một phần thưởng, truy cập vào các thư viện Java có thể cực kỳ hữu ích. (Trong trường hợp của tôi, việc triển khai hỗ trợ đăng nhập OpenID, điều này sẽ khó khăn với Common Lisp, thật dễ dàng với Clojure.) Do đó, nếu ứng dụng của bạn cần tương tác với các dịch vụ web hoặc định dạng dữ liệu của bên thứ ba, tôi khuyên bạn nên cái nhìn tốt và dài tại Clojure.

Các giao diện REST cũng dễ thực hiện trong khung công tác web kiểu Hunchentoot/Noir. Tôi không thể đánh giá máy chủ web của Racket về vấn đề này, vì tôi không đủ quen thuộc với nó.

+0

Tôi đã liếc nhanh qua Hunchentoot, nhưng có vẻ như nó hỗ trợ một số động từ hạn chế, điều này có đúng không? (GET và POST) - Tôi cần thứ gì đó linh hoạt hơn thế. Truy cập vào yêu cầu http và tiêu đề phản hồi thô là khá quan trọng trong dịch vụ web. Clojure/Noir dường như cung cấp truy cập như vậy. Tôi nghĩ rằng Racket cũng có thể truy cập các tiêu đề thô, nhưng nó chắc chắn sẽ đòi hỏi nhiều hơn một cái nhìn nhanh chóng để đánh giá bản chất của Racket. Có lẽ một số người ủng hộ Racket sẽ để lại một số ý kiến. –

+2

@MattEsch Với Hunchentoot, bạn có thể truy cập phương thức yêu cầu bằng cách sử dụng hàm 'request-method *'. Ngay cả 'define-easy-handler' cũng không quan tâm nhiều đến động từ - bạn có thể thực hiện yêu cầu' CASTMAGIC' nếu bạn muốn, và nó sẽ hoạt động. :) (Hãy thử viết một trình xử lý đơn giản trả về chỉ '(ký hiệu-tên (hunchentoot: request-method *))'.Với Noir, có hỗ trợ trực tiếp cho các động từ HTTP chuẩn ('GET',' POST', 'PUT',' DELETE', 'HEAD') trong cơ chế gửi. Cả Hunchentoot và Noir đều cho phép bạn truy cập các tiêu đề yêu cầu HTTP. –

+0

Cảm ơn bạn đã làm rõ. Tôi đã chỉ bối rối là tại sao các tài liệu đã làm cho một điểm của các động từ cụ thể GET và POST (giống như nó là một số loại mới lạ). Cám ơn giải thích rõ ràng. Tôi sẽ đi với Hunchentoot và xem những gì tôi có thể nghĩ ra. Tôi sẽ để câu hỏi mở ngay bây giờ chỉ để xem nó có trả lời các câu trả lời khác không. –

6

Tôi biết một lẽ phù hợp với nhu cầu của bạn: Clack

Clack là một môi trường ứng dụng web cho Common Lisp lấy cảm hứng từ WSGI Python và Ruby rack.

Hy vọng điều đó sẽ hữu ích.