Compare commits
3 Commits
0ffbd506e6
...
3bd627e095
Author | SHA1 | Date | |
---|---|---|---|
3bd627e095 | |||
c65b8834ba | |||
428cc23449 |
436
README.org
436
README.org
@ -4,7 +4,7 @@
|
||||
#+latex_class_options: [11pt,a4paper,english,svgnames]
|
||||
#+macro: kbd (eval (by-backend-kbd-org-macro $1))
|
||||
#+options: ^:{}
|
||||
#+property: header-args:emacs-lisp :exports code :results silent :tangle init.el
|
||||
#+property: header-args:emacs-lisp :exports code :tangle init.el
|
||||
#+startup: showeverything
|
||||
#+begin_src latex :noweb yes :results raw
|
||||
,#+latex_header: <<latex-header-1>>
|
||||
@ -376,8 +376,6 @@ the contents of packages and allows to update packages to the latest version.
|
||||
#+begin_src emacs-lisp -n :results silent
|
||||
(when (require 'treesit nil 'noerror)
|
||||
(setopt
|
||||
;; Set `tab-width' in `after-change-major-mode-hook' function too.
|
||||
go-ts-mode-indent-offset 2
|
||||
treesit-language-source-alist
|
||||
'((bash "https://github.com/tree-sitter/tree-sitter-bash" "master" "src")
|
||||
(c "https://github.com/tree-sitter/tree-sitter-c" "master" "src")
|
||||
@ -407,13 +405,7 @@ the contents of packages and allows to update packages to the latest version.
|
||||
"master" "tsx/src")
|
||||
(typescript "https://github.com/tree-sitter/tree-sitter-typescript"
|
||||
"master" "typescript/src")
|
||||
(yaml "https://github.com/ikatyang/tree-sitter-yaml" "master" "src")))
|
||||
|
||||
(add-hook 'after-change-major-mode-hook
|
||||
(defun on-go-ts-mode-hook ()
|
||||
(when (derived-mode-p 'go-ts-mode 'go-mod-ts-mode)
|
||||
(setq-local tab-width 2))))
|
||||
(add-to-list 'auto-mode-alist `(,(rx ".go" eos) . go-ts-mode)))
|
||||
(yaml "https://github.com/ikatyang/tree-sitter-yaml" "master" "src"))))
|
||||
#+end_src
|
||||
|
||||
* [[info:emacs#Faces][Text faces or styles (info)]]
|
||||
@ -2132,11 +2124,9 @@ list detailing and motivating each listing:
|
||||
"\\end{document}\n")))
|
||||
|
||||
(with-eval-after-load 'ob-lisp
|
||||
;; (with-eval-after-load 'slime
|
||||
;; (setopt org-babel-lisp-eval-fn #'slime-eval))
|
||||
(with-eval-after-load 'sly
|
||||
(setopt org-babel-lisp-eval-fn #'sly-eval))
|
||||
)
|
||||
;; Default to `sly-eval' whenever feasible:
|
||||
(when (package-installed-p 'sly)
|
||||
(setopt org-babel-lisp-eval-fn #'sly-eval)))
|
||||
|
||||
(with-eval-after-load 'emacs
|
||||
(defun set-org-babel-language-activity (lang active)
|
||||
@ -4013,22 +4003,16 @@ that do not visit a file.
|
||||
:CUSTOM_ID: sec:common-lisp-programming
|
||||
:END:
|
||||
|
||||
Listing [[lst:configure-sly]] configures the [[info:sly#Top][Sly (info)]] Common Lisp IDE for Emacs
|
||||
for use with [[http://www.sbcl.org/][Steel Bank Common Lisp (sbcl)]]:
|
||||
1. It configures =sly-default-lisp= and =sly-lisp-implementations= as in the
|
||||
~sly~ documentation string instead of in the [[info:sly#Multiple Lisps][multiple lisps (info)]] manual.
|
||||
2. It ensures the [[info:sly#Auto-SLY][automatic connection to the lisp server (info)]] when opening a
|
||||
Common Lisp file.
|
||||
3. It configures searching documentation in the [[http://www.lispworks.com/documentation/HyperSpec/Front/][Common Lisp HyperSpec]] according
|
||||
to the [[info:sly#Basic customization][basic customization (info)]] manual.
|
||||
Finally, listing [[lst:configure-sly]] uses a technique to [[info:sly#Loading Slynk faster][load Slynk faster (info)]]
|
||||
by means of a custom core file in src_emacs-lisp{no-littering-var-directory}.
|
||||
Listing [[lst:sbcl-core-for-sly]] tangles to a script to dump such a [[http://www.sbcl.org/][SBCL]] core.
|
||||
*** [[https://slime.common-lisp.dev/doc/html/index.html][Slime]] :noexport:
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:slime
|
||||
:header-args:emacs-lisp: :exports code :tangle no
|
||||
:END:
|
||||
|
||||
#+caption[Configure =slime=]:
|
||||
#+caption: Configure =slime=.
|
||||
#+name: lst:configure-slime
|
||||
#+begin_src emacs-lisp -n :results silent :tangle no
|
||||
#+begin_src emacs-lisp -n :results silent
|
||||
(when (ensure-package-installation 'slime)
|
||||
(with-eval-after-load 'slime
|
||||
(setq slime-default-lisp 'sbcl
|
||||
@ -4056,6 +4040,24 @@ Listing [[lst:sbcl-core-for-sly]] tangles to a script to dump such a [[http://ww
|
||||
(keymap-set slime-prefix-map "M-h" #'slime-documentation-lookup)))
|
||||
#+end_src
|
||||
|
||||
*** [[https://joaotavora.github.io/sly/][Sly]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:sly
|
||||
:END:
|
||||
|
||||
Listing [[lst:configure-sly]] configures the [[info:sly#Top][Sly (info)]] Common Lisp IDE for Emacs
|
||||
for use with [[http://www.sbcl.org/][Steel Bank Common Lisp (sbcl)]]:
|
||||
1. It configures =sly-default-lisp= and =sly-lisp-implementations= as in the
|
||||
~sly~ documentation string instead of in the [[info:sly#Multiple Lisps][multiple lisps (info)]] manual.
|
||||
2. It does not ensure the [[info:sly#Auto-SLY][automatic connection to the lisp server (info)]] when
|
||||
opening a Common Lisp file because it does not play well with =ob-lisp=.
|
||||
3. It configures searching documentation in the [[http://www.lispworks.com/documentation/HyperSpec/Front/][Common Lisp HyperSpec]] according
|
||||
to the [[info:sly#Basic customization][basic customization (info)]] manual.
|
||||
Listing [[lst:slink-sel]] allows to set or get the Sly string elision length.
|
||||
Finally, listing [[lst:configure-sly]] uses a technique to [[info:sly#Loading Slynk faster][load Slynk faster (info)]]
|
||||
by means of a custom core file in src_emacs-lisp{no-littering-var-directory}.
|
||||
Listing [[lst:sbcl-core-for-sly]] tangles to a script to dump such a [[http://www.sbcl.org/][SBCL]] core.
|
||||
|
||||
#+caption[Configure =sly=]:
|
||||
#+caption: Configure =sly=.
|
||||
#+name: lst:configure-sly
|
||||
@ -4094,6 +4096,51 @@ Listing [[lst:sbcl-core-for-sly]] tangles to a script to dump such a [[http://ww
|
||||
(keymap-set sly-prefix-map "M-h" #'sly-documentation-lookup)))
|
||||
#+end_src
|
||||
|
||||
#+caption[Get/set Sly ~slynk:*string-elision-length*~ functionality]:
|
||||
#+caption: Get/set Sly ~slynk:*string-elision-length*~ functionality.
|
||||
#+name: lst:slink-sel
|
||||
#+begin_src emacs-lisp -n :results silent
|
||||
(with-eval-after-load 'sly
|
||||
(defconst slynk-command-get-sel
|
||||
"(cdr (assoc 'slynk:*string-elision-length* slynk:*slynk-pprint-bindings*))"
|
||||
"Slynk \"string elision length\" getter command.")
|
||||
|
||||
(defun slynk-command-set-sel (sel)
|
||||
"Slynk SEL \"string elision length\" setter command.
|
||||
SEL values must be positive integers to enable or `nil' to disable elision."
|
||||
(format "(setf %s %s)" slynk-command-get-sel sel))
|
||||
|
||||
(defun slynk-get-sel ()
|
||||
"Get the Slynk \"string-elision-length\"."
|
||||
(cadr (sly-eval `(slynk:eval-and-grab-output ,slynk-command-get-sel))))
|
||||
|
||||
(defun slynk-set-sel (sel)
|
||||
"Set the Slynk \"string-elision-length\" SEL.
|
||||
SEL values must be positive integers to enable or `nil' to disable elision."
|
||||
(cadr (sly-eval `(slynk:eval-and-grab-output ,(slynk-command-set-sel sel)))))
|
||||
|
||||
(defun slynk-eval-sel-command (string)
|
||||
"Evaluate the Slynk \"string-elision-length\" command STRING."
|
||||
(unless (sly-connected-p)
|
||||
(user-error "Slynk connection is not open: \"M-x sly\"?"))
|
||||
(message "Slynk string elision length is %S"
|
||||
(read (cadr (sly-eval `(slynk:eval-and-grab-output ,string))))))
|
||||
|
||||
(defun slynk-get-string-elision-length ()
|
||||
"Get the Slynk \"string-elision-length\"."
|
||||
(interactive)
|
||||
(slynk-eval-sel-command slynk-command-get-sel))
|
||||
|
||||
(defun slynk-set-string-elision-length (&optional sel)
|
||||
"Set the Slynk \"string-elision-length\" by evaluting SEL.
|
||||
Valid SEL values are positive integers to enable or `nil' to disable elision."
|
||||
(interactive "XSlynk string-elision-length (nil or sel > 0): ")
|
||||
(unless (or (null sel) (and (integerp sel) (> sel 0)))
|
||||
(user-error
|
||||
"Slynk `sel' must evaluate to `nil' or a positive integer (got `%S')" sel))
|
||||
(slynk-eval-sel-command (slynk-command-set-sel sel))))
|
||||
#+end_src
|
||||
|
||||
#+caption[Script to dump a SBCL core for the Sly Common Lisp IDE]:
|
||||
#+caption: Script to dump a SBCL core for the Sly Common Lisp IDE.
|
||||
#+header: :tangle-mode (identity #o755)
|
||||
@ -4113,9 +4160,152 @@ EOF
|
||||
# End:
|
||||
#+end_src
|
||||
|
||||
*** [[https://www.n16f.net/blog/custom-font-lock-configuration-in-emacs/][Common Lisp custom font locking]]
|
||||
*** [[https://courses.cs.northwestern.edu/325/][CS 325 AI Programming]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:cl-custom-font-locking
|
||||
:CUSTOM_ID: sec:cs-325-ai-programming
|
||||
:END:
|
||||
|
||||
The [[https://courses.cs.northwestern.edu/325/][CS 325 AI Programming]] course allows to learn Common Lisp by self-study and
|
||||
the page [[https://courses.cs.northwestern.edu/325/admin/lisp-setup.php][CS 325: Setting up Lisp]] gives instructions how to:
|
||||
1. [[https://courses.cs.northwestern.edu/325/admin/lisp-setup.php#lisp][Download and install common lisp]].
|
||||
2. [[https://courses.cs.northwestern.edu/325/admin/lisp-setup.php#quicklisp][Install Quicklisp]].
|
||||
3. [[https://courses.cs.northwestern.edu/325/admin/lisp-setup.php#install-325][Install the CS325 library]].
|
||||
|
||||
*** [[https://www.quicklisp.org/][Quicklisp]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:quicklisp
|
||||
:END:
|
||||
|
||||
[[https://www.quicklisp.org/][Quicklisp]] is a library manager for Common Lisp. Listing
|
||||
[[lst:download+verify-quicklisp]] downloads the [[https://www.quicklisp.org/][Quicklisp]] installation file and
|
||||
verifies its signature to prevent tampering. Listing [[lst:bootstrap-quicklisp]]
|
||||
tangles to a shell script allowing to bootstrap [[https://www.quicklisp.org/][Quicklisp]] with [[http://www.sbcl.org/][SBCL]]. Listing
|
||||
[[lst:quicklisp-sbclrc-file]] tangles to the a [[http://www.sbcl.org/][SBCL]] resource file with [[https://www.quicklisp.org/][Quicklisp]]
|
||||
support. Listing [[lst:clone-local-projects]] shows how to make local projects out
|
||||
of unpackaged projects and listing [[lst:register-load-local-projects]] shows how to
|
||||
register local projects in order to load those unpackaged projects in the same
|
||||
way as packaged projects.
|
||||
|
||||
#+caption[Download and verify =quicklisp=]:
|
||||
#+caption: Download and verify =quicklisp=.
|
||||
#+name: lst:download+verify-quicklisp
|
||||
#+begin_src shell -n :dir ~ :results none :tangle no
|
||||
curl -sS -O https://beta.quicklisp.org/quicklisp.lisp
|
||||
curl -sS -O https://beta.quicklisp.org/quicklisp.lisp.asc
|
||||
curl -sS -O https://beta.quicklisp.org/release-key.txt
|
||||
gpg --import release-key.txt
|
||||
gpg --verify quicklisp.lisp.asc quicklisp.lisp
|
||||
#+end_src
|
||||
|
||||
#+caption[Bootstrap =quicklisp=]:
|
||||
#+caption: Bootstrap =quicklisp=.
|
||||
#+header: :tangle-mode (identity #o755)
|
||||
#+name: lst:bootstrap-quicklisp
|
||||
#+begin_src shell -n :noeval :tangle ~/bin/quicklisp-sbcl-bootstrap
|
||||
#!/bin/sh
|
||||
|
||||
sbcl --load ~/quicklisp.lisp <<EOF
|
||||
(quicklisp-quickstart:install)
|
||||
(quit)
|
||||
EOF
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# sh-basic-offset: 2
|
||||
# End:
|
||||
#+end_src
|
||||
|
||||
#+caption[Clone local =quicklisp= projects]:
|
||||
#+caption: Clone local =quicklisp= projects.
|
||||
#+name: lst:clone-local-projects
|
||||
#+begin_src shell -n :dir ~/quicklisp/local-projects :results none :tangle no
|
||||
git clone https://gitlab.com/criesbeck/cs325.git
|
||||
git clone git@github.com:ageldama/cl-state-machine.git
|
||||
#+end_src
|
||||
|
||||
#+caption[Register and load local =quicklisp= projects with dependencies]:
|
||||
#+caption: Register and load local =quicklisp= projects with dependencies.
|
||||
#+name: lst:register-load-local-projects
|
||||
#+begin_src lisp -n :eval never-export :results none :tangle no
|
||||
;; SBCL on Darwin fails to run cl-cffi-gtk:
|
||||
;; https://lisp-journey.gitlab.io/blog/gui-programming-in-common-lisp-part-3-of-5-gtk3/
|
||||
;; https://www.crategus.com/books/cl-cffi-gtk/
|
||||
;; https://www.crategus.com/books/cl-gtk/gtk-tutorial.html
|
||||
(defun probe--local-project-directory (name)
|
||||
(some #'identity (mapcar (lambda (x)
|
||||
(let ((*default-pathname-defaults* x))
|
||||
(probe-file name)))
|
||||
ql:*local-project-directories*)))
|
||||
|
||||
(when (probe--local-project-directory "cs325")
|
||||
(ql:register-local-projects)
|
||||
(ql:quickload "cs325")
|
||||
(ql:quickload "meta")
|
||||
(ql:quickload '("named-readtables" "try")) ;; testing requires "try".
|
||||
#-:clozure
|
||||
(ql:quickload "nodgui") ;; requires https://www.tcl.tk/software/tklib/
|
||||
(ql:quickload '("rutils" "rutilsx"))
|
||||
(ql:quickload "ucons"))
|
||||
|
||||
(when (probe--local-project-directory "cl-state-machine")
|
||||
(ql:quickload '("cl-state-machine" "cl-state-machine-examples"
|
||||
"cl-state-machine-graphing" "cl-state-machine-test")))
|
||||
#+end_src
|
||||
|
||||
#+caption: A =quicklisp= sbclrc file.
|
||||
#+name: lst:quicklisp-sbclrc-file
|
||||
#+begin_src lisp -n :eval never :tangle ~/.sbclrc
|
||||
;;; Hey Emacs, this is my -*- lisp -*- .sbclrc file.
|
||||
|
||||
;;; The following lines added by ql:add-to-init-file:
|
||||
#-quicklisp
|
||||
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
|
||||
(user-homedir-pathname))))
|
||||
(when (probe-file quicklisp-init)
|
||||
(load quicklisp-init)))
|
||||
|
||||
;;; Load cs325.lisp to create the cs325 package.
|
||||
|
||||
;; (eval-when (:compile-toplevel :load-toplevel :execute)
|
||||
;; (ql:quickload "cs325")
|
||||
;; (setq *package* (find-package :cs325-user)))
|
||||
#+end_src
|
||||
|
||||
*** [[https://github.com/hellerve/sbcli][Better REPL for SBCL]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:sbcli
|
||||
:END:
|
||||
|
||||
#+caption[Install =sbcli=]:
|
||||
#+caption: Install =sbcli=.
|
||||
#+name: lst:install-sbcli
|
||||
#+begin_src emacs-lisp -n :eval never-export :lexical t :tangle no
|
||||
(let ((url "https://raw.githubusercontent.com/hellerve/sbcli/master/repl.lisp")
|
||||
(file "~/bin/sbcli"))
|
||||
(url-copy-file url file 'ok-if-already-exists)
|
||||
(set-file-modes file #o700))
|
||||
#+end_src
|
||||
|
||||
#+caption[Tangle a =sbcli= resource file]:
|
||||
#+caption: Tangle a =sbcli= resource file.
|
||||
#+name: lst:write-sbslirc
|
||||
#+begin_src lisp -n :eval never :tangle ~/.sbclirc
|
||||
(setf *repl-name* "Gerard's custom REPL for SBCLI")
|
||||
;; The style option fails:
|
||||
;; (setf *pygmentize* (merge-pathnames ".pyenv/shims/pygmentize"
|
||||
;; (user-homedir-pathname)))
|
||||
;; (defvar *pygmentize-options* (list "-s" "-l" "lisp" "-O" "style=zenburn"))
|
||||
#+end_src
|
||||
|
||||
** [[https://www.n16f.net/blog/custom-font-lock-configuration-in-emacs/][Lisp mode custom font locking for Common Lisp]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:lisp-custom-font-locking
|
||||
:END:
|
||||
|
||||
*** [[https://www.n16f.net/blog/custom-font-lock-configuration-in-emacs/][Initialize Common Lisp custom font locking]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:cl-custom-font-locking-start
|
||||
:END:
|
||||
|
||||
#+caption[Define faces for =Common Lisp= custom font locking]:
|
||||
@ -4138,15 +4328,6 @@ EOF
|
||||
"The face used to highlight standard Common Lisp value symbols.")
|
||||
#+end_src
|
||||
|
||||
#+caption[Setup =SLY= printing]:
|
||||
#+caption: Setup =SLY= printing.
|
||||
#+name: lst:setup-sly-printing
|
||||
#+begin_src lisp -n :eval never-export :results silent :tangle no
|
||||
;; Works in case of sly, but fails in case of slime.
|
||||
(rplacd (assoc 'slynk:*string-elision-length* slynk:*slynk-pprint-bindings*)
|
||||
(ash 1 14))
|
||||
#+end_src
|
||||
|
||||
#+caption[Define a =Common Lisp= function to find standard symbol names]:
|
||||
#+caption: Define a =Common Lisp= function to find standard symbol names.
|
||||
#+name: lst:standard-symbol-names
|
||||
@ -4159,6 +4340,28 @@ EOF
|
||||
(sort symbols #'string<)))
|
||||
#+end_src
|
||||
|
||||
#+caption[Set Sly ~slynk:*string-elision-length*~]:
|
||||
#+caption: Set Sly ~slynk:*string-elision-length*~.
|
||||
#+name: lst:set-sly-sel
|
||||
#+header: :wrap "src text -n"
|
||||
#+begin_src emacs-lisp -n :eval never-export :exports both :tangle no
|
||||
(when (and (fboundp 'sly-connected-p) (sly-connected-p))
|
||||
(and (fboundp 'slynk-set-sel) (slynk-set-sel (ash 1 14))))
|
||||
#+end_src
|
||||
|
||||
#+caption[Set Sly ~slynk:*string-elision-length*~ result]:
|
||||
#+caption: Set Sly ~slynk:*string-elision-length*~ result.
|
||||
#+name: lst:set-sly-sel-result
|
||||
#+RESULTS: lst:set-sly-sel
|
||||
#+begin_src text -n
|
||||
16384 (15 bits, #x4000)
|
||||
#+end_src
|
||||
|
||||
*** [[https://www.n16f.net/blog/custom-font-lock-configuration-in-emacs/][Collect standard symbol function names]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:cl-function-names
|
||||
:END:
|
||||
|
||||
#+caption[Define the =cl-function-names= variable in an =Emacs Lisp= block]:
|
||||
#+caption: Use =Common Lisp= to define the =cl-function-names= variable in
|
||||
#+caption: an =Emacs Lisp= source block for tangling into =user-init-file=.
|
||||
@ -4325,7 +4528,10 @@ EOF
|
||||
"yes-or-no-p" "zerop"))
|
||||
#+end_src
|
||||
|
||||
\newpage
|
||||
*** [[https://www.n16f.net/blog/custom-font-lock-configuration-in-emacs/][Collect standard symbol value names]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:cl-value-names
|
||||
:END:
|
||||
|
||||
#+caption[Define the =cl-variable-names= variable in an =Emacs Lisp= block]:
|
||||
#+caption: Use =Common Lisp= to define the =cl-variable-names= variable in
|
||||
@ -4381,6 +4587,11 @@ EOF
|
||||
"single-float-negative-epsilon" "t"))
|
||||
#+end_src
|
||||
|
||||
*** [[https://www.n16f.net/blog/custom-font-lock-configuration-in-emacs/][Finalize Common Lisp custom font locking]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:cl-custom-font-locking-final
|
||||
:END:
|
||||
|
||||
#+caption[Finalize =Common Lisp= custom font locking]:
|
||||
#+caption: Finalize =Common Lisp= custom font locking.
|
||||
#+name: lst:finalize-cl-custom-font-locking
|
||||
@ -4410,139 +4621,6 @@ EOF
|
||||
(add-hook 'lisp-mode-hook 'cl-init-lisp-font-lock)
|
||||
#+end_src
|
||||
|
||||
*** [[https://courses.cs.northwestern.edu/325/][CS 325 AI Programming]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:cs-325-ai-programming
|
||||
:END:
|
||||
|
||||
The [[https://courses.cs.northwestern.edu/325/][CS 325 AI Programming]] course allows to learn Common Lisp by self-study and
|
||||
the page [[https://courses.cs.northwestern.edu/325/admin/lisp-setup.php][CS 325: Setting up Lisp]] gives instructions how to:
|
||||
1. [[https://courses.cs.northwestern.edu/325/admin/lisp-setup.php#lisp][Download and install common lisp]].
|
||||
2. [[https://courses.cs.northwestern.edu/325/admin/lisp-setup.php#quicklisp][Install Quicklisp]].
|
||||
3. [[https://courses.cs.northwestern.edu/325/admin/lisp-setup.php#install-325][Install the CS325 library]].
|
||||
|
||||
*** [[https://www.quicklisp.org/][Quicklisp]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:quicklisp
|
||||
:END:
|
||||
|
||||
[[https://www.quicklisp.org/][Quicklisp]] is a library manager for Common Lisp. Listing
|
||||
[[lst:download+verify-quicklisp]] downloads the [[https://www.quicklisp.org/][Quicklisp]] installation file and
|
||||
verifies its signature to prevent tampering. Listing [[lst:bootstrap-quicklisp]]
|
||||
tangles to a shell script allowing to bootstrap [[https://www.quicklisp.org/][Quicklisp]] with [[http://www.sbcl.org/][SBCL]]. Listing
|
||||
[[lst:quicklisp-sbclrc-file]] tangles to the a [[http://www.sbcl.org/][SBCL]] resource file with [[https://www.quicklisp.org/][Quicklisp]]
|
||||
support. Listing [[lst:clone-local-projects]] shows how to make local projects out
|
||||
of unpackaged projects and listing [[lst:register-load-local-projects]] shows how to
|
||||
register local projects in order to load those unpackaged projects in the same
|
||||
way as packaged projects.
|
||||
|
||||
#+caption[Download and verify =quicklisp=]:
|
||||
#+caption: Download and verify =quicklisp=.
|
||||
#+name: lst:download+verify-quicklisp
|
||||
#+begin_src shell -n :dir ~ :results none :tangle no
|
||||
curl -sS -O https://beta.quicklisp.org/quicklisp.lisp
|
||||
curl -sS -O https://beta.quicklisp.org/quicklisp.lisp.asc
|
||||
curl -sS -O https://beta.quicklisp.org/release-key.txt
|
||||
gpg --import release-key.txt
|
||||
gpg --verify quicklisp.lisp.asc quicklisp.lisp
|
||||
#+end_src
|
||||
|
||||
#+caption[Bootstrap =quicklisp=]:
|
||||
#+caption: Bootstrap =quicklisp=.
|
||||
#+header: :tangle-mode (identity #o755)
|
||||
#+name: lst:bootstrap-quicklisp
|
||||
#+begin_src shell -n :noeval :tangle ~/bin/quicklisp-sbcl-bootstrap
|
||||
#!/bin/sh
|
||||
|
||||
sbcl --load ~/quicklisp.lisp <<EOF
|
||||
(quicklisp-quickstart:install)
|
||||
(quit)
|
||||
EOF
|
||||
|
||||
# Local Variables:
|
||||
# mode: shell-script
|
||||
# sh-indentation: 2
|
||||
# sh-basic-offset: 2
|
||||
# End:
|
||||
#+end_src
|
||||
|
||||
#+caption[Clone local =quicklisp= projects]:
|
||||
#+caption: Clone local =quicklisp= projects.
|
||||
#+name: lst:clone-local-projects
|
||||
#+begin_src shell -n :dir ~/quicklisp/local-projects :results none :tangle no
|
||||
git clone https://gitlab.com/criesbeck/cs325.git
|
||||
git clone git@github.com:ageldama/cl-state-machine.git
|
||||
#+end_src
|
||||
|
||||
#+caption[Register and load local =quicklisp= projects with dependencies]:
|
||||
#+caption: Register and load local =quicklisp= projects with dependencies.
|
||||
#+name: lst:register-load-local-projects
|
||||
#+begin_src lisp -n :eval never-export :results none :tangle no
|
||||
;; SBCL on Darwin fails to run cl-cffi-gtk:
|
||||
;; https://lisp-journey.gitlab.io/blog/gui-programming-in-common-lisp-part-3-of-5-gtk3/
|
||||
;; https://www.crategus.com/books/cl-cffi-gtk/
|
||||
;; https://www.crategus.com/books/cl-gtk/gtk-tutorial.html
|
||||
(defun probe--local-project-directory (name)
|
||||
(some #'identity (mapcar (lambda (x)
|
||||
(let ((*default-pathname-defaults* x))
|
||||
(probe-file name)))
|
||||
ql:*local-project-directories*)))
|
||||
|
||||
(when (probe--local-project-directory "cs325")
|
||||
(ql:register-local-projects)
|
||||
(ql:quickload "cs325")
|
||||
(ql:quickload "meta")
|
||||
(ql:quickload '("named-readtables" "try")) ;; testing requires "try".
|
||||
#-:clozure
|
||||
(ql:quickload "nodgui") ;; requires https://www.tcl.tk/software/tklib/
|
||||
(ql:quickload '("rutils" "rutilsx"))
|
||||
(ql:quickload "ucons"))
|
||||
|
||||
(when (probe--local-project-directory "cl-state-machine")
|
||||
(ql:quickload '("cl-state-machine" "cl-state-machine-examples"
|
||||
"cl-state-machine-graphing" "cl-state-machine-test")))
|
||||
#+end_src
|
||||
|
||||
#+caption: A =quicklisp= sbclrc file.
|
||||
#+name: lst:quicklisp-sbclrc-file
|
||||
#+begin_src lisp -n :eval never :tangle ~/.sbclrc
|
||||
;;; Hey Emacs, this is my -*- lisp -*- .sbclrc file.
|
||||
|
||||
;;; The following lines added by ql:add-to-init-file:
|
||||
#-quicklisp
|
||||
(let ((quicklisp-init (merge-pathnames "quicklisp/setup.lisp"
|
||||
(user-homedir-pathname))))
|
||||
(when (probe-file quicklisp-init)
|
||||
(load quicklisp-init)))
|
||||
|
||||
;;; Load cs325.lisp to create the cs325 package.
|
||||
|
||||
;; (eval-when (:compile-toplevel :load-toplevel :execute)
|
||||
;; (ql:quickload "cs325")
|
||||
;; (setq *package* (find-package :cs325-user)))
|
||||
#+end_src
|
||||
|
||||
#+caption[Install =sbcli=]:
|
||||
#+caption: Install =sbcli=.
|
||||
#+name: lst:install-sbcli
|
||||
#+begin_src emacs-lisp -n :eval never-export :lexical t :tangle no
|
||||
(let ((url "https://raw.githubusercontent.com/hellerve/sbcli/master/repl.lisp")
|
||||
(file "~/bin/sbcli"))
|
||||
(url-copy-file url file 'ok-if-already-exists)
|
||||
(set-file-modes file #o700))
|
||||
#+end_src
|
||||
|
||||
#+caption[Tangle a =sbcli= resource file]:
|
||||
#+caption: Tangle a =sbcli= resource file.
|
||||
#+name: lst:write-sbslirc
|
||||
#+begin_src lisp -n :eval never :tangle ~/.sbclirc
|
||||
(setf *repl-name* "Gerard's custom REPL for SBCLI")
|
||||
;; The style option fails:
|
||||
;; (setf *pygmentize* (merge-pathnames ".pyenv/shims/pygmentize"
|
||||
;; (user-homedir-pathname)))
|
||||
;; (defvar *pygmentize-options* (list "-s" "-l" "lisp" "-O" "style=zenburn"))
|
||||
#+end_src
|
||||
|
||||
** [[info:eintr#Top][Emacs Lisp Programming (info)]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:emacs-lisp-programming
|
||||
@ -4667,6 +4745,20 @@ byte code:
|
||||
|
||||
1. [[https://gobyexample.com/][Go by example]]
|
||||
|
||||
#+caption[Setup Go programming]:
|
||||
#+caption: Setup Go programming.
|
||||
#+name: lst:setup-go
|
||||
#+begin_src emacs-lisp -n
|
||||
(when (featurep 'treesit)
|
||||
;; Set `tab-width' in `after-change-major-mode-hook' function too.
|
||||
(setopt go-ts-mode-indent-offset 2)
|
||||
(add-hook 'after-change-major-mode-hook
|
||||
(defun on-go-ts-mode-hook ()
|
||||
(when (derived-mode-p 'go-ts-mode 'go-mod-ts-mode)
|
||||
(setq-local tab-width 2))))
|
||||
(add-to-list 'auto-mode-alist `(,(rx ".go" eos) . go-ts-mode)))
|
||||
#+end_src
|
||||
|
||||
** [[info:maxima#Top][Maxima Programming (info)]]
|
||||
:PROPERTIES:
|
||||
:CUSTOM_ID: sec:maxima-programming
|
||||
|
Loading…
Reference in New Issue
Block a user