Bagaimana cara mulai menulis kode Lisp?

Seringkali Anda harus melihat bagaimana pemula mencoba Common Lisp dan kemudian mengeluh bahwa tidak mungkin untuk bekerja secara normal dengannya. Sebagai aturan, ini disebabkan oleh fakta bahwa mereka tidak mengerti cara mengatur proses yang memberikan "tanggapan cepat" yang sama dari lingkungan pengembangan, ketika Anda mengubah fungsi, mengkompilasinya, dan perubahan itu segera mulai digunakan di dalam program yang sudah berjalan tanpa restart itu.


Anda dapat memahami tampilannya dengan menonton video di youtube yang menunjukkan perkembangan interaktif di Common Lisp.



Hari ini saya ingin menunjukkan cara mengatur lingkungan dev untuk pengembangan seperti itu. Pada tahun 2018, itu menjadi sangat sederhana, berkat penyetelan yang terus ditingkatkan.


Saya minta maaf sebelumnya untuk video-video berikut yang direkam di Asciinema, dan Habrahabr tidak mendukungnya. Klik screenshot konsol untuk menonton video.


Pertama, instal SBCL , Roswell, dan Emacs . Saya akan berbicara tentang contoh menginstal semuanya di OSX, dan saya akan senang jika di komentar Anda berbagi pengalaman di Windows dan Linux. Lalu saya bisa menambah artikel dengan contoh untuk ketiga platform.


SBCL adalah salah satu dari banyak implementasi Common Lisp. Dari sumber terbuka, tercepat. Jika diinginkan, pada SBCL Anda dapat menjalankan kode pada kecepatan yang sebanding dengan kode C ++, tetapi pada saat yang sama memiliki semua barang dari pengembangan interaktif cepat.


Roswell adalah utilitas untuk menginstal dan menjalankan program Common Lisp. Termasuk dia tahu cara menjalankan Emacs yang sudah dikonfigurasi sebelumnya, serta mengumpulkan program dalam binari.


Anda mungkin mengenal Emacs - sistem operasi seperti itu yang juga memiliki editor kode. Anda dapat menulis dalam Common Lisp dan editor lainnya, tetapi hari ini Emacs memiliki integrasi dan dukungan terbaik untuk pengeditan kode semantik. Dengan dia Anda tidak perlu menghitung tanda kurung, dia melakukan segalanya untuk Anda.


Jadi, jika Anda menggunakan OSX, maka yang perlu Anda lakukan


brew install roswell emacs 

Setelah menyeduh gemerisik disk dan meletakkan semua yang Anda butuhkan, jalankan saja di terminal:


 ros run 

Perintah ini akan secara otomatis memberi Anda versi terbaru SBCL dan memulai Lisp repl, tempat Anda dapat memasukkan kode:



Tapi ini bukan masalahnya, itu tidak dirancang. Jadi mari kita konfigurasikan Emacs untuk pengembangan penuh:


 ros emacs 

Tim akan meluncurkan Emacs di konsol dan mengkonfigurasi Quicklisp, manajer paket untuk Common Lisp.
Tetapi sebelum kita melanjutkan, mari kita mengkonfigurasi terminal, emacs dan OSX sehingga mereka bekerja dengan baik.


Pertama, Anda perlu mengubah beberapa pengaturan di OSX dan iTerm


Jadikan CapsLock berfungsi seperti Kontrol. Di Emacs, tidak ada tempat tanpa itu:



Kemudian nonaktifkan semua kombinasi yang terkait dengan penggunaan Kontrol dan panah dalam bidikan MissionControl:



Kemudian masukkan iTerm2 dan alihkan perilaku Alt di pengaturan profil dari Normal ke Esc +:



Setelah itu, buat file dengan konfigurasi minimal untuk 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)) 

Setelah itu, jalankan ros emacs lagi, tekan Alt-X dan masukkan perintah slime . Akibatnya, kita mendapatkan baris perintah untuk memasukkan perintah lisp:



Sekarang Anda sudah bisa kode


Tapi kami tidak akan memasukkan perintah di replay, lebih baik segera memulai pengembangan layanan mikro. Jika Anda hanya membutuhkan API, maka cara termudah adalah menggunakan Ningle . Jika Anda membutuhkan kerangka kerja yang lebih maju, seperti hutan, maka Anda dapat mencoba Radiance atau Caveman2 . Tapi sekarang kita tidak akan melakukan sesuatu yang rumit, tetapi kita akan membangkitkan cookie HTTP sederhana.


Buka file server.lisp ( Cx Cf server.lisp ) di Emacs dan mulai menulis kode. Sesuatu seperti ini:



Akibatnya, server web akan diluncurkan di dalam instance Anda, di mana Anda dapat menambahkan rute dan mendefinisikan kembali tampilan saat bepergian.


Ini seluruh kode, untuk yang malas:


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

Dalam Lisp, konstruksi yang berada di dalam tanda kurung disebut "formulir". Bentuk yang ada di atas dan tidak bersarang di yang lain disebut tingkat atas. Formulir tersebut dapat dikompilasi dengan mengklik Cc Cc ketika kursor berada di dalam formulir tersebut. Jika Anda mengaktifkan kembali CapsLock on ontrol , maka kombinasi ini sangat mudah untuk ditekan.


Setelah formulir dikompilasi, versi baru dari fungsi segera berlaku dan server restart tidak diperlukan. Jadi sangat nyaman untuk debug dan memperbaiki bug. Selain itu, Anda dapat mengonfigurasi uji coba otomatis segera setelah mengkompilasi bagian dari kode, tetapi ini adalah cerita yang sama sekali berbeda.


Jika Anda tertarik pada topik lain, tulis di komentar, saya akan mencoba membuat posting tentang mereka juga.

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


All Articles