试了下CommonLisp的WEB开发

Lisp语言的Web开发 Lisp(LISt Processing)是一种早期的编程语言,诞生于1958年,由约翰·麦卡锡(John McCarthy)发明。Lisp以其独特的S表达式(Symbolic Expression)表示法和强大的递归处理能力而闻名。虽然Lisp的许多变种(如Common Lisp、Scheme、Clojure等)都在不同的领域得到了应用,但它们都保留了Lisp的核心特性。 阅读详情

很多人喜欢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 试试!


Common Lisp学习资源:练习与解决方案大全 本文还有配套的精品资源,点击获取 简介:Common Lisp是一种历史悠久且应用广泛的编程语言,以其独特的语法、灵活性和强大的宏系统而知名。这个项目“learninglisp”提供了丰富的练习和解决方案,帮助学习者逐步掌握Lisp编程。项目内容包括S表达式的使用,符号计算的能力,以及一系列教程、练习题目、解决方案、测试脚本、代码片段和阅读材料。通过这些资源,学习者可以深入... 阅读详情

相关推荐

Common Lisp基础WEB应用教程:BBS论坛系统实践

本文还有配套的精品资源,点击获取 简介:cl-webapp-sample 是一个基于 Common Lisp 的 Web 应用示例,实现了一个基础的论坛(BBS)功能,为学习者提供了学习 Common Lisp Web 开发的实践案例。项目包括使用说明、安装指南、作者信息及版权声明。同时,项目的构建和运行可能涉及到 JavaScript 以增强前端交互,且可能使用 Git ...

weixin_31176789的博客 1807

Common Lisp编程初步---环境搭建和外部lisp代码运行

1 介绍Lisp是世界上第二古老的语言,第一古老语言是Fortran。Lisp语言的创立者为John McCarthy,一位人工智能领域里的先驱。该语言自创立以来经历了50多年而不衰,是一种很有生命力的语言。该语言的发展和使用与CMU和MIT两所高校密不可分,在相当长的时期内是这两所高校的大学计算机课程指定语言。在该语言创立之初,除了创建者外,还有其他的一些高校著名学者也参与到了Lisp语言的发展完

陈广智的专栏 1万+

实用Common.Lisp编程.pdf

实用Common.Lisp编程.pdf,2011.10出版

lisp web html 开发环境,Common Lisp 开发环境搭建

LISP 发展了这么多年,演化了多种方言,主要有Common lisp, schema,emacs lisp等,先选一种“通用”的学习吧。搭建环境:Sbcl +slimeSbcl: (Common Lisp compiler )http://www.sbcl.org/index.htmlSlime:The Superior LispInteraction Mode for EmacsEmacs 下...

weixin_39596739的博客 323

实用Common Lisp编程

包含中英文版本以及书中样例代码。 这是一本不同寻常的Common Lisp入门书。本书首先从作者的学习经过及语言历史出发,随后用21个章节讲述了各种基础知识,主要包括:REPL 及Common Lisp 的各种实现、S- 表达式、函数与变量、标准宏与自定义宏、数字与字符以及字符串、集合与向量、列表处理、文件与文件I/O 处理、类、FORMAT格式、符号与包,等等。而接下来的9 个章节则翔实地介绍了几个有代表性的实例,其中包含如何构建垃圾过滤器、解析二进制文件、构建ID3 解析器,以及如何编写一个完整的MP3 Web 应用程序等内容。最后还对一些未介绍内容加以延伸。   本书内容适合Common Lisp 初学者及对之感兴趣的相关人士。

从Arduino IDE到Atmel Studio:ATmega328P开发的进阶之路

本文探讨了从Arduino IDE转向Atmel Studio进行ATmega328P开发的进阶路径。通过对比两者差异,详细介绍了Atmel Studio的环境配置、寄存器操作思维、烧录方法及高级调试功能,帮助开发者突破Arduino的封装限制,实现对单片机底层硬件的精细控制与性能优化,提升嵌入式开发的专业能力。

weixin_29193259的博客 122

一个实际的Lisp项目开发心得

在万家灯火,元宵节的烟花绚烂绽放的时刻,checkin了代码,随手统计了下代码行,恰好1000行整(包括空行)。冥冥中自有天意? 这个项目是一个分布编译打包发布程序,需要控制多台远端的服务器进行编译,编译过程有很多步骤,还要根据需要增删build 的步骤即参数。 最早的程序是用Python写的,只在一台机器上作,后来随着项目越来越复杂,打包编译花的时间越来越多。于是决定重写,那谁说重写...

编程开发资料库 510

Labelme AI-Polygon闪退排查与修复指南

本文详细介绍了Labelme AI-Polygon功能闪退问题的排查与修复方法,包括环境配置检查、模型路径设置、依赖库版本控制等关键步骤。通过系统性的解决方案和实用技巧,帮助用户快速解决闪退问题,确保数据标注工作的高效进行。

weixin_29311017的博客 140

Common Lisp第三方库介绍 | (R "think-of-lisper" 'Albertlee)

Common Lisp第三方库介绍 | (R "think-of-lisper" 'Albertlee) Common Lisp第三方库介绍 | (R "think-of-lisper" 'Albertlee)Common Lisp第三方库介绍一个丰富且高质量的开发...

358

Windows下MMdetection3D保姆级安装指南(含CUDA和PyTorch版本避坑)

本文提供Windows平台下MMdetection3D的完整安装指南,重点解决CUDA与PyTorch版本匹配问题。从环境准备到关键组件安装,详细介绍了CUDA Toolkit选择策略、PyTorch精准安装步骤,以及MM系列组件的安装顺序和常见错误解决方案,帮助用户顺利完成3D目标检测环境的配置。

weixin_42628941的博客 491

手把手教你用三极管搭建麦克风音频放大电路(附完整电路图)

本文详细介绍了如何使用三极管搭建麦克风音频放大电路,包括电路设计基础、元件选择、完整电路图及分步焊接指南。通过实际操作和调试技巧,帮助电子爱好者和学生深入理解模拟电路原理,实现音质清晰的音频放大效果。

Black的专栏 985

推荐开源项目:Hunchentoot - 常见Lisp Web服务器与构建动态网站的工具箱

推荐开源项目:Hunchentoot - 常见Lisp Web服务器与构建动态网站的工具箱 1、项目介绍 Hunchentoot,一个用Common Lisp编写的Web服务器,同时也是一个用于构建动态网站的强力工具包。它不仅具备处理HTTP/1.1分块传输(双向支持)、持久连接(保持活跃)和SSL加密的能力,还能为开发者带来诸多便利。 2、项目技术分析 Hunchentoot的核心特性在于其灵活...

gitblog_00076的博客 486

Flowable第一篇、快速上手(Flowable安装、配置、集成)

Flowable是一个轻量级、高效可扩展的工作流和业务流程管理(BPM)引擎,支持在Java应用程序中实现复杂的工作流自动化。Flowable最初是作为Activiti项目的一个分支发展而来的,但它现在已经成为一个独立的开源项目,并在企业级应用中得到了广泛使用

Du_XiaoNan的博客 1万+

Jolt大奖作品、重磅星级图书尽在十月

《实用Common Lisp编程》 ◎第16届Jolt生产效率大奖得主 ◎计算机科学领域的经典语言之一 ◎著有名噪一时访谈录《编程人生》(Coders at work) 《持续交付:发布可靠软件的系统方法》 ◎第18届Jolt震撼大奖得主 ◎Martin Fowler作序推荐 ◎ 软件构建、部署、测试和发布的必...

weixin_34100227的博客 149

用MATLAB计算卡方值

然后,我们计算了期望频数,即在两个分类变量独立的情况下,每个单元格的预期频数。接下来,我们使用卡方检验的公式计算了卡方值。卡方检验是一种常用的统计方法,用于确定两个分类变量之间是否存在相关性。它基于观察到的频数和期望频数之间的差异来评估分类变量之间的独立性。在MATLAB中,我们可以使用。请注意,这只是一个简单的示例代码,用于说明如何使用MATLAB计算卡方值。在实际应用中,您可能需要根据您的具体数据和研究问题进行相应的修改和调整。在上面的代码中,我们首先创建了两个分类变量。函数显示了计算得到的卡方值。

CodeNexus的博客 2658

AUTOSAR AP——SM模块

对AUTOSAR AP中状态管理模块SM,从模块定义、总结等多方面进行了介绍。

weixin_43627682的博客 284

Parenscript:将Lisp的强大带入JavaScript世界

Parenscript:将Lisp的强大带入JavaScript世界 项目介绍 Parenscript 是一个从 Common Lisp 的扩展子集翻译到 JavaScript 的翻译器。通过 Parenscript,开发者可以在浏览器(作为 JavaScript)和服务器(作为 Common Lisp)上几乎相同地运行代码。Parenscript 代码被视为与 Common Lisp 代码相同,...

gitblog_00013的博客 1037

stm32项目实战(1)光敏电阻的介绍和使用

文章目录前言一、光敏电阻介绍二、cubeMX配置三、代码说明总结 前言 本篇文章我们讲带大家了解光敏电阻的使用 一、光敏电阻介绍 下面是4线光敏电阻实物图 产品接线说明: 1、VCC 接电源正极 3.3-5V 2、GND 接电源负极 3、DO TTL 开关信号输出 (配置为输出模式) 4、AO 模拟信号输出(ADC采样通道) 光敏电阻主要用于检测周围的光照强度,光照强度发生变化那么ADC采样的值也会发送变化。 二、cubeMX配置 简单的配置我们就不多说了主要是ADC采样的配置 这里我采用的是ADC1通道

m0_49476241的博客 1万+

试用 Portable Allegro Serve

安装好 Common Lisp 的开发环境后,想试试看 web 开发。 虽然 Allegro Serve 运行起来更简单,但是要在 Allegro CL 中运行,而后者是个商业软件,暂时我没有购买的打算。退而求其次,只好用 Portable Allegro Serve. 这个开源代码貌似很久没更新了。下载后,运行出了很多小问题。简要记录如下: 用 CLisp 来运行的时候,可能下...

weixin_30907523的博客 124

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Common Lisp

Common Lisp 简介 Common Lisp是一个多范式的通用程序语言,它同时支持过程式,函数式和面向对象式等多种编程风格。它有强大的宏,能够在编译的不同时期被调用。它能在运行时重编译部分程序而无须重新启动,从而使得渐进式的软件开发变得容易。 Common Lisp有一套工业标准,叫ANSI CL。 各种实现 Common Lisp有许多实

石头 1100

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

上一篇: Lisp的本质(The Nature of Lisp)
下一篇: 告别人工智能之父、Lisp语言发明者John McCarthy
lambda_z
博客等级 码龄19年 35粉丝 23原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值