如何开始编写Lisp代码?

通常,您必须看到初学者如何尝试Common Lisp,然后抱怨无法正常使用它。 通常,这是由于他们不了解如何建立一个可以在开发环境中提供相同“快速响应”的过程,所以当您更改功能,对其进行编译并且更改立即开始在已经运行的程序中使用时,重新启动它。


您可以通过在youtube上观看演示Common Lisp上的交互式开发的视频来了解它的外观。



今天,我想展示如何为此类开发建立开发环境。 在2018年,由于不断改进调音,它变得非常简单。


对于以下视频在Asciinema中录制,我深表歉意,Habrahabr不支持此视频。 单击控制台的屏幕截图以观看视频。


首先,安装SBCLRoswellEmacs 。 我将讨论在OSX中安装所有内容的示例,如果您在评论中分享了在Windows和Linux上的经验,我将感到高兴。 然后,我可以用所有三个平台的示例来补充本文。


SBCL是Common Lisp的许多实现之一。 在开源方面,最快。 如果需要,您可以在SBCL上以与C ++代码相当的速度运行代码,但同时具有来自快速交互开发的所有好处。


Roswell是用于安装和运行Common Lisp程序的实用程序。 其中包括她知道如何运行预配置的Emacs,以及如何收集二进制文件中的程序。


您可能知道Emacs-这种也具有代码编辑器的操作系统。 您可以使用Common Lisp或任何其他编辑器进行编写,但是如今Emacs具有对代码的语义编辑的最佳集成和支持。 与他在一起,您不必指望括号,他会为您做所有事情。


因此,如果您使用OSX,则需要


brew install roswell emacs 

在brew冲破磁盘并放入所需的所有内容后,只需在终端中运行:


 ros run 

此命令将自动为您提供最新版本的SBCL并启动Lisp repl,您可以在其中输入代码:



但事实并非如此,并非如此设计。 因此,让我们配置Emacs进行全面开发:


 ros emacs 

该团队将在控制台中启动Emacs并配置Commonlisp的软件包管理器Quicklisp。
但是在继续之前,让我们配置终端,emacs和OSX,以便它们可以很好地协同工作。


首先,您需要在OSX和iTerm中更改一些设置


使CapsLock像Control一样工作。 在Emacs中,无处不在:



然后在MissionControl的快照中禁用所有与使用Control和箭头相关的组合:



然后将iTerm2放在配置文件设置中,将Alt行为从Normal切换到Esc +:



之后,为Emacs创建一个具有最低配置的文件~/.emacs.d/init.el


 (package-initialize) (require 'package) (add-to-list 'package-archives '("MELPA" . "http://melpa.milkbox.net/packages/") t) (defun install-package (package) (unless (package-installed-p package) (package-refresh-contents) (package-install package))) (install-package 'paredit) (install-package 'expand-region) (defun setup-lisp-mode () (require 'paredit) (paredit-mode) (define-key paredit-mode-map (kbd "Cw") 'paredit-backward-kill-word)) (add-hook 'lisp-mode-hook 'setup-lisp-mode) (add-hook 'emacs-lisp-mode-hook 'setup-lisp-mode) ;;  Cw           ;;  kill-region (global-set-key (kbd "Cw") 'backward-kill-word) ;;      kmacro- (global-set-key (kbd "Cx Ck") 'kill-region) ;;  indent-new-comment-line (global-set-key (kbd "Mj") (lambda () (interactive) (join-line -1))) ;;    (global-set-key (kbd "Cc rs") 'replace-string) (global-set-key (kbd "Cc rr") 'replace-regexp) ;;    emacs    ;;      =,   ;;    . (global-set-key (kbd "Cc =") 'er/expand-region) ;;      , ;;        (global-set-key (kbd "Cc c") 'comment-or-uncomment-region) (global-set-key (kbd "Cc C-\\") 'goto-last-change) (setq custom-file "~/.emacs.d/customizations.el") (when (file-exists-p custom-file) (load custom-file)) 

之后,再次运行ros emacs,按Alt-X并输入slime命令。 结果,我们得到了用于输入lisp命令的命令行:



现在您已经可以编写代码


但我们不会在重播中输入命令,最好立即开始开发微服务。 如果只需要一个API,那么使用Ningle的最简单方法。 如果您需要更高级的框架(例如丛林),则可以尝试RadianceCaveman2 。 但是现在我们不会做任何复杂的事情,但是我们将激发一个简单的HTTP cookie。


在Emacs中打开server.lisp文件( Cx Cf server.lisp )并开始编写代码。 像这样:



结果,将在您的实例内部启动一个Web服务器,您可以在其中添加路线并在旅途中重新定义视图。


这是整个代码,对于懒惰的人:


 ;; Micro-framework for building API (ql:quickload :ningle) ;; Now ningle is installed and we need to install a clack which is analog of WSGI ;; stack from Python ;; I've pressed Cc Cc to eval this form (ql:quickload :clack) ;; To parse json: (ql:quickload :jonathan) (defvar *app* (make-instance 'ningle:<app>)) (setf (ningle:route *app* "/") ;; in case, if you need to parse or serialize JSON, ;; use Jonthan library. (jonathan:to-json '(:foo 100500))) (defvar *server* nil "This variable will store currently running server instance.") (defun start () (if *server* (format t "Server already started") (setf *server* (clack:clackup *app*)))) (defun stop () (if *server* (clack:stop *server*) (format t "Server is not running"))) 

在Lisp中,括号内的构造称为“形式”。 位于顶部且未嵌套在其他表单中的表单称为顶层。 当光标位于此类表单内时,可以通过单击Cc Cc来编译此类表单。 如果在ontrol上重新绑定CapsLock ,则按此组合键非常方便。


编译表单后,该函数的新版本将立即生效,并且不需要重新启动服务器。 因此,调试和修复错误非常方便。 此外,您可以在编译部分代码后立即配置自动测试运行,但这是一个完全不同的故事。


如果您对其他主题感兴趣,请在评论中写下,我也会尝试发表有关它们的文章。

Source: https://habr.com/ru/post/zh-CN413061/


All Articles