كيف تبدأ في كتابة كود Lisp؟

غالبًا ما يجب أن ترى كيف يجرب المبتدئون Common Lisp ثم يشكون من أنه من المستحيل العمل بشكل طبيعي معها. كقاعدة عامة ، يرجع ذلك إلى حقيقة أنهم لا يفهمون كيفية إعداد عملية توفر نفس "الاستجابة السريعة" من بيئة التطوير ، عندما قمت بتغيير الوظيفة وتجميعها ، وبدأ استخدام التغييرات على الفور داخل البرنامج قيد التشغيل بالفعل دون إعادة تشغيله.


يمكنك فهم كيف يبدو من خلال مشاهدة مقطع فيديو على موقع يوتيوب يوضح التطور التفاعلي على Common Lisp.



اليوم أريد أن أبين كيفية إعداد بيئة تطوير لمثل هذا التطور. في عام 2018 ، أصبح الأمر بسيطًا جدًا ، بفضل التحسين المستمر للضبط.


أعتذر مقدمًا عن تسجيل مقاطع الفيديو التالية في Asciinema ، ولا يدعمها Habrahabr. انقر على لقطات شاشة وحدة التحكم لمشاهدة مقاطع الفيديو.


أولاً ، قم بتثبيت SBCL و Roswell و Emacs . سأتحدث عن مثال تثبيت كل شيء في OSX ، وسأكون سعيدًا إذا شاركت في التعليقات تجربتك في Windows و Linux. ثم يمكنني استكمال المقالة بأمثلة لجميع المنصات الثلاثة.


SBCL هي واحدة من العديد من تطبيقات Common Lisp. من المصدر المفتوح الأسرع. إذا رغبت في ذلك ، يمكنك تشغيل التعليمات البرمجية على SBCL بسرعة مماثلة لرمز C ++ ، ولكن في نفس الوقت الحصول على جميع الأشياء الجيدة من التطوير التفاعلي السريع.


Roswell هو أداة مساعدة لتثبيت وتشغيل برامج Common Lisp. بما في ذلك أنها تعرف كيفية تشغيل Emacs المهيأة مسبقًا ، بالإضافة إلى جمع البرامج في الثنائيات.


ربما تعرف Emacs - مثل نظام التشغيل الذي يحتوي أيضًا على محرر تعليمات برمجية. يمكنك الكتابة في Common Lisp وفي أي محرر آخر ، ولكن لدى Emacs اليوم أفضل تكامل ودعم للتحرير الدلالي للكود. معه ليس عليك عد الأقواس ، فهو يفعل كل شيء من أجلك.


لذا ، إذا كنت تستخدم OSX ، فعليك القيام بذلك


brew install roswell emacs 

بعد أن يسرق المشروب القرص ويضع كل ما تحتاجه ، فقط قم بتشغيله في المحطة:


 ros run 

سيعطيك هذا الأمر تلقائيًا أحدث إصدار من SBCL وسيبدأ استبدال Lisp ، حيث يمكنك إدخال الرمز:



ولكن ليس هذا هو الحال ، فهي ليست مصممة على هذا النحو. لذلك دعونا نقوم بتكوين Emacs للتطوير الكامل:


 ros emacs 

سيقوم الفريق بإطلاق Emacs في وحدة التحكم وتكوين Quicklisp ، مدير الحزم لـ Common Lisp.
ولكن قبل أن نواصل ، دعنا نقوم بتهيئة الوحدة الطرفية و emacs و OSX بحيث تعمل معًا بشكل جيد.


أولاً ، تحتاج إلى تغيير بعض الإعدادات في OSX و iTerm


جعل CapsLock يعمل مثل التحكم. في Emacs ، لا مكان بدونها:



ثم قم بتعطيل جميع المجموعات المرتبطة باستخدام التحكم والسهام في لقطات MissionControl:



ثم ضع iTerm2 وقم بتبديل سلوك Alt في إعدادات ملف التعريف من عادي إلى 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 إذا كنت بحاجة إلى إطار عمل أكثر تقدمًا ، مثل الغابة ، فيمكنك تجربة Radiance أو Caveman2 . ولكن الآن لن نقوم بأي شيء معقد ، ولكننا سنقوم بتهيئة ملف تعريف ارتباط HTTP بسيط.


افتح ملف server.lisp ( Cx Cf server.lisp ) في Emacs وابدأ في كتابة التعليمات البرمجية. شيء من هذا القبيل:



ونتيجة لذلك ، سيتم تشغيل خادم الويب داخل المثيل ، حيث يمكنك إضافة مسارات وإعادة تعريف طرق العرض أثناء التنقل.


هنا هو الرمز الكامل للكسالى:


 ;; 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 عندما يكون المؤشر داخل مثل هذا النموذج. إذا قمت بإعادة CapsLock مفتاح CapsLock عند ontrol ، فإن هذه المجموعة ملائمة جدًا للضغط.


بعد تجميع النموذج ، يتم تفعيل إصدار جديد من الوظيفة على الفور ولا يلزم إعادة تشغيل الخادم. لذا من الملائم جدًا تصحيح الأخطاء وإصلاحها. بالإضافة إلى ذلك ، يمكنك تكوين تشغيل الاختبار التلقائي فورًا بعد تجميع جزء من الشفرة ، ولكن هذه قصة مختلفة تمامًا.


إذا كنت مهتمًا بأي مواضيع أخرى ، فاكتب في التعليقات ، وسأحاول نشر مشاركات عنها أيضًا.

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


All Articles