日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

试了下CommonLisp的WEB开发

發布時間:2025/6/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 试了下CommonLisp的WEB开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

很多人喜歡Rails這種“All in One"的方式, 不過個人更喜歡搭積木的方式。每個小系統專心做好自己的事, 然后大家合作產生具有更強大功能的系統。 從網上收集了一些樣本代碼, 用SBCL試了下, 感覺不錯。

>(ql:quickload?"quickproject")

>(quickproject:make-project? "/media/E/RnD/clisp/web/"?:depends-on?'(hunchentoot cl-who cl-json parenacript css-lite elephant))

web項目的架子就搭好了:

%ls
README.txt? web.db? package.lisp? web.asd? web.lisp

%cat web.asd

(asdf:defsystem?:web
? :serial t
??:depends-on?(:hunchentoot
?????????????? :cl-who
?????????????? :cl-json
?????????????? :css-lite
?????????????? :parenscript
?????????????? :elephant)
??:components?((:file "package")
?????????????? (:file "web")))

其中各組件的功能,網上一查就知。簡單說一下:?

cl-who用于產生XHTML;? parenscript用于產生客戶端JavaScript;? elephant用于操作數據庫。


%cat package.lisp

(defpackage?:web
? (:use?:cl :cl-who :hunchentoot :parenscript :elephant)
? (:import-from?:css-lite :css)
? (:import-from?:json :encode-json-to-string))


%cat web.lisp
(in-package?#:web)

;;; "web" goes here. Hacks and glory await!

;; 啟動WEB服務器
(setf??*web-server*??(start??(make-instance?'hunchentoot:acceptor :port 8000)))

;; 輸出所有靜態內容
(push?(create-static-file-dispatcher-and-handler?"/GameVoter.png" "statics/imgs/GameVoter.png") ?*dispatch-table*)
(push?(create-static-file-dispatcher-and-handler?"/site.css" "statics/css/site.css")*dispatch-table*)

;; 啟動Elephant
(setf?*store*?(open-store?'(:clsql??(:sqlite3??"/media/E/RnD/clisp/web/web.db"))))

;; 將每一個游戲表示為Elephant持久類的一個實例
(defpclass?persistent-game?()
?? ((name :reader name :initarg :name :index t)
??? (votes :accessor votes :initarg :votes :initform 0 :index t)))

(defmethod?vote-for (user-selected-game)
??? (incf?(votes user-selected-game)))

(defun?game-from-name (name)
? (get-instance-by-value?'persistent-game?'name name))

(defun?game-stored? (game-name)
? (game-from-name game-name))

(defun?add-game (name)
? (with-transaction?()
??? (unless?(game-stored? name)
????? (make-instance?'persistent-game?:name name))))

;; 返回以流行程度排序的游戲列表
(defun?games ()
? (nreverse?(get-instances-by-range?'persistent-game?'votes nil nil)))

;; 對指定URL(加上.htm)自動生成 Hunchentoot 的處理器
(defmacro?define-url-fn ((name)??&body?body)
??`(progn
???? (defun ,name?()
???????,@body)
???? (push?(create-prefix-dispatcher?,(format?nil "/~(~a~)" name) ',name)?*dispatch-table*)))


;;標準頁面,使網站的風格一致
(defmacro?standard-page?((&key?title)?&body?body)
??`(with-html-output-to-string?(*standard-output* nil :prologue t :indent t)
???? (:html?:xmlns "http://www.w3.org/1999/xhtml"? :xml\:lang "en" :lang "en"
?????? (:head?
???????? (:meta?:http-equiv "Content-Type" :content "text/html;charset=utf-8")
?? ? (:title?,title)
?? ? (:link?:type "text/css" :rel "stylesheet" :href "/site.css"))
?? ??? (:body?
?? ????? (:div :id "header" ; Start all pages with our header.
?? ??????? (:img?:src "/GameVoter.png" :alt "Game Voter Logo" :class "logo")
?? ??????? (:span?:class "strapline" "Vote for your favourite Video Game"))
?? ??????,@body))))

;; 負責產生HTML的函數
(define-url-fn (index)
? (standard-page?(:title "Game Voter")
???? (:h1?"Vote on your all time favourite games!")
???? (:p?"Missing a game? Make it available for votes " (:a?:href "new-game" "here"))
???? (:h2?"Current stand")
???? (:div?:id "chart" ; Used for CSS styling of the links.
?????? (:ol
?? ?(dolist?(game (games))
?? ? (htm??
?? ?? (:li?(:a?:href (format?nil "vote?name=~a" (name game)) "Vote!")
?? ??????? (fmt?"~A with ~d votes" (name game) (votes game)))))))))

(define-url-fn (new-game)
? (standard-page?(:title "Add a new game")
???? (:h1?"Add a new game to the chart")
???? (:form?:action "/game-added" :method "post"
?? ???? :onsubmit (ps-inline?? ?? ; 客戶端驗證
?? ? ? ? ? (when?(=?name.value "")
?? ??? ??? ? (alert?"Please enter a name.")
?? ??? ??? ? (return?false)))
?????? (:p?"What is the name of the game?" (:br)
?? ??? (:input?:type "text" :name "name" :class "txt"))
?????? (:p?(:input :type "submit" :value "Add" :class "btn")))))

(define-url-fn (game-added)
? (let?((name (parameter "name")))
??? (unless?(or?(null?name) (zerop?(length?name))) ; 萬一 JavaScript 關閉了
????? (add-game name))
??? (redirect?"/index")))?

(define-url-fn (vote)
? (let?((game (game-from-name (parameter "name"))))
??? (if?game
?? ?(vote-for game))
??? (redirect?"/index")))


回到SBCL?

>(ql:quickload "web")

在瀏覽器中訪問 http://127.0.0.1:8000/index 試試!


總結

以上是生活随笔為你收集整理的试了下CommonLisp的WEB开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产熟女精品视频 | 超碰人人干人人 | 免费在线观看污网站 | av网站一区 | 色女人在线 | 五级黄高潮片90分钟视频 | 人人操日日干 | 色吊丝中文字幕 | 国产91美女视频 | 男人的天堂日韩 | 国产高潮国产高潮久久久91 | 影音先锋在线视频观看 | 色一区二区三区 | 日本高清二区 | 久久成人福利 | www.久久| 午夜精 | 国产成人精品免费看视频 | 麻豆视频免费入口 | 特级西西444www高清大视频 | 天堂在线观看中文字幕 | 懂色av懂色av粉嫩av分享吧 | 亚洲黄色在线 | 日本a大片| 伊人草草 | 五月少妇 | 亚洲91网站 | 亚洲h片| 好吊妞一区二区三区 | 欧美做受视频 | 国产精品18久久久久久vr下载 | 女生扒开尿口 | 黄色理伦| www.亚洲天堂.com| 操一操 | 一本色道久久加勒比精品 | 国产日韩一区二区三免费高清 | 香蕉视频啪啪 | 成人黄色免费观看 | 男人天堂成人网 | 富婆如狼似虎找黑人老外 | 国产高清自拍视频 | 免看黄大片aa | 成年人av在线播放 | 亚洲一区欧美日韩 | 午夜av影院| 一级肉体全黄毛片 | 免费欧美在线 | 日本在线观看www | 被黑人各种姿势猛c哭h文1 | 日韩在线免费观看视频 | 日韩在线视频观看免费 | 欧美日a| 美女撒尿无遮挡网站 | 日韩人妻精品无码一区二区三区 | 91本色| 国产精品视频久久久久久久 | 网址av| 日韩精品2区 | av激情影院 | 中文字幕23 | 欧美激情一区二区三区p站 欧美mv日韩mv国产网站app | 四虎永久在线精品免费网址 | 婷婷久久综合网 | 免费看日韩 | 求av网址 | ass亚洲熟妇毛耸耸pics | 精品香蕉一区二区三区 | 九九免费精品视频 | 日本黄色一级视频 | sese视频在线观看 | 亚洲快播 | 三级在线观看 | 成人午夜视频一区二区播放 | 粗大的内捧猛烈进出 | 伊人成人在线 | 99久久久国产精品无码免费 | 在线视频国产一区 | 成人综合在线视频 | 狠狠躁夜夜躁人人爽天天高潮 | 性网址 | 理论片午午伦夜理片影院99 | 国产suv精品一区二区60 | 精品韩国一区二区三区 | 玖玖精品视频 | 99久久99久久| 三级在线看中文字幕完整版 | 豆花视频成人 | 一区二区久久精品66国产精品 | 久久影视精品 | 三级a毛片 | 亚洲欧美激情精品一区二区 | 91爱视频| 欧美三级视频网站 | 日日舔夜夜操 | 欧美a级黄色 | 国产白浆视频 | 爱情岛论坛自拍亚洲品质极速最新章 | 亚洲欧美一区二区三区久久 |