Como começar a escrever o código Lisp?

Muitas vezes, você precisa ver como os iniciantes tentam o Common Lisp e depois reclamar que é impossível trabalhar normalmente com ele. Como regra, isso se deve ao fato de eles não entenderem como configurar um processo que fornece a mesma "resposta rápida" do ambiente de desenvolvimento, quando você alterou a função, a compilou e as alterações começaram a ser usadas imediatamente dentro do programa já em execução sem reiniciando-o.


Você pode entender como fica assistindo um vídeo no youtube que demonstra o desenvolvimento interativo no Common Lisp.



Hoje eu quero mostrar como configurar um ambiente de desenvolvimento para esse desenvolvimento. Em 2018, tornou-se muito simples, graças à melhoria constante do ajuste.


Peço desculpas antecipadamente pelos seguintes vídeos sendo gravados no Asciinema, e o Habrahabr não o suporta. Clique nas capturas de tela do console para assistir a vídeos.


Primeiro, instale o SBCL , Roswell e Emacs . Falarei sobre o exemplo de instalação de tudo no OSX e ficarei feliz se nos comentários você compartilhar sua experiência no Windows e Linux. Então eu posso complementar o artigo com exemplos para as três plataformas.


SBCL é uma das muitas implementações do Common Lisp. Do código aberto, o mais rápido. Se desejado, no SBCL, você pode executar o código a uma velocidade comparável ao código C ++, mas ao mesmo tempo tendo todas as vantagens do rápido desenvolvimento interativo.


Roswell é um utilitário para instalar e executar programas Common Lisp. Inclusive ela sabe como executar o Emacs pré-configurado, bem como coletar programas em binários.


Você provavelmente conhece o Emacs - um sistema operacional que também possui um editor de código. Você pode escrever no Common Lisp e em qualquer outro editor, mas hoje o Emacs tem a melhor integração e suporte para a edição semântica do código. Com ele você não precisa contar parênteses, ele faz tudo por você.


Então, se você usa o OSX, precisa fazer


brew install roswell emacs 

Depois que a mistura mexer no disco e colocar tudo o que você precisa, basta executar no terminal:


 ros run 

Este comando fornecerá automaticamente a versão mais recente do SBCL e iniciará o Lisp repl, onde você poderá inserir o código:



Mas esse não é o caso, não é tão projetado. Então, vamos configurar o Emacs para desenvolvimento completo:


 ros emacs 

A equipe iniciará o Emacs no console e configurará o Quicklisp, o gerenciador de pacotes do Common Lisp.
Mas antes de continuarmos, vamos configurar o terminal, emacs e OSX para que funcionem bem juntos.


Primeiro, você precisa alterar algumas configurações no OSX e no iTerm


Faça o CapsLock funcionar como Control. No Emacs, em nenhum lugar sem ele:



Em seguida, desative todas as combinações associadas ao uso do controle e das setas nas imagens do MissionControl:



Em seguida, coloque o iTerm2 e alterne o comportamento Alt nas configurações de perfil de Normal para Esc +:



Depois disso, crie um arquivo com uma configuração mínima para o 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)) 

Depois disso, execute o ros emacs novamente, pressione Alt-X e insira o comando slime . Como resultado, obtemos a linha de comando para inserir comandos lisp:



Agora você já pode codificar


Mas não digitaremos comandos na reprodução, é melhor iniciar o desenvolvimento de um microsserviço imediatamente. Se você precisa apenas de uma API, a maneira mais fácil é usar o Ningle . Se você precisar de uma estrutura mais avançada, como uma selva, poderá experimentar Radiance ou Caveman2 . Mas agora não faremos nada complicado, mas criaremos um simples cookie HTTP.


Abra o arquivo server.lisp ( Cx Cf server.lisp ) no Emacs e comece a escrever o código. Algo assim:



Como resultado, um servidor Web será iniciado dentro da sua instância, no qual você poderá adicionar rotas e redefinir visualizações em movimento.


Aqui está o código inteiro, para o preguiçoso:


 ;; 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"))) 

No Lisp, as construções que estão entre colchetes são chamadas de "formas". Os formulários que estão no topo e não aninhados em nenhum outro são chamados de nível superior. Esses formulários podem ser compilados clicando em Cc Cc quando o cursor estiver dentro desse formulário. Se você reativar o CapsLock no ontrol , essa combinação é muito conveniente para pressionar.


Após a compilação do formulário, uma nova versão da função entra em vigor imediatamente e a reinicialização do servidor não é necessária. Portanto, é muito conveniente depurar e corrigir erros. Além disso, você pode configurar o teste automático imediatamente após a compilação de parte do código, mas essa é uma história completamente diferente.


Se você estiver interessado em outros tópicos, escreva nos comentários, também tentarei fazer posts sobre eles.

Source: https://habr.com/ru/post/pt413061/


All Articles