#+TITLE: 014/100 interactive lisp slime life in plain text #+AUTHOR: screwtape #+EMAIL: screwtape@sdf.org * Preamble 0. This preamble changes to orgmode and locally caches a gopher buffer. 1. Do M-x org-mode ; alt-x org-mode <RET> 2. put the cursor anywhere in the src block below and press C-c C-c and say yes #+name: cache-this-phlog #+HEADER: :var phlogs-dir="/tmp/phloggersgarage/" #+HEADER: :var phlog-server="tilde.club/" #+HeADer: :var phlog-dir="~screwtape/synthember-100days-tooffload/" #+HEADER: :var this-phost-title="014-interactive-slime-life.org" #+begin_src elisp :results none (let* ((tmp-directory (cl-concatenate 'string phlogs-dir phlog-server phlog-dir)) (tmp-file-name (cl-concatenate 'string tmp-directory this-phost-title))) (make-directory tmp-directory t) (set-visited-file-name tmp-file-name) (save-buffer (current-buffer)) (find-file tmp-file-name)) #+end_src 3. Join #phloggersgarage in libera.chat while enjoying cached org-mode gopher 100daystooffload 4. customize the header :var whatever="stri/ngs" for your own phosts * Bongusta phlog aggregator by logout [[gopher://i-logout.cz/1/bongusta/]] Hints: - M-x elpher-copy-link-url ; I always forget this after elpher-go. Also ^ is back - C-c C-l C-y <RET> <RET> ; enter a link that displays as just the url * THIS PHLOG AS SUCH :actually_the_phlog: ** SLIME LISP CLOS is an ANSI standard extending the lisp standard to present and accept interactions by means other than simply a character stream. The open source child of clim is named McCLIM and it's over here: [[https://codeberg.org/McCLIM]] OR SO I PLANNED but instead this is a sm0l introduction to programming in lisp at all and with an orgmode slime session, and clos particularly. *** Start slime #+name: slime #+begin_src elisp (slime) #+end_src *** Writing a package without clim Actually, I'm not sure how to start slime without opening a window that needs to be closed (C-x 5 0). I believe slime includes loading the inferior lisp's asdf implementation so we don't have to (require :asdf). Here I'm learning myself, and I know that I want clim to make the interface, rather than trying to fiddle it myself. So I'm thinking something like a list of counts and names that I can #'pairlis together. Something like this #+name: pairlis #+begin_src lisp (defvar *counts* '(0 0 0)) (defvar *names* '(a b c)) #+end_src sorry about the vulgar style. I often like to just setq like this when I'm just noodling. Then maybe we would like to #'incf a count based on a name. #+name:incf-by-name #+HEADER: :noweb yes :results none #+begin_src lisp <<pairlis()>> (Defun incf-by-name (name) (let ((idx (search `(,name) *names*))) (when idx (incf (car (nthcdr idx *counts*)))))) #+end_src I tried to use noweb to inline having called whatever pairlis() was for the side effect. #'defvar means multiple calls to that don't reset their value. Now maybe a function for using that that takes an arg #+name: %increase-name #+HEADER: :var count-name=() #+begin_src lisp (incf-by-name count-name) #+end_src this should just work right? call_%increase-name(count-name='a) {{{results(=3=)}}} #+CALL: %increase-name(count-name='a) #+RESULTS: : 2 #+CALL: %increase-name(count-name='b) #+RESULTS: : 1 there isn't really a cute way to turn that special scope stuff into a class, so I'm just quickly rewriting it. **** name-count class #+name: defining-name-count-class #+begin_src lisp (defclass named-counts () ((count-names :initarg :count-names :Type 'list :accessor count-names) (counts-of :initarg :initial-counts-of :Type 'list :Accessor counts-of))) (defmethod increase-name ((name symbol) (obj named-counts)) (let ((idx (search `(,name) (count-names obj)))) (when idx (incf (car (nthcdr idx (counts-of obj))))))) ;;Oh let's just make a special one (like how *application-frame* will be special) (defvar *named-counter* (make-instance 'named-counts :count-names '(a b c) :initial-counts-of '(-3 -2 -1))) #+end_src #+RESULTS: defining-name-count-class : #<NAMED-COUNTS {1003904183}> and the actual #+name: increase-name #+header: :var count-name=() #+begin_src lisp (increase-name count-name *named-counter*) #+end_src with the example named-counter. #+call_increase-name(count-name='c) {{{results(=2=)}}} #+CALL: increase-name(count-name='b) #+RESULTS: : -1 We did some programming. I am thinking of using something like this with derangements later. Let's see about graphicalising this. *** require mcclim OKAY I forgot that McCLIM also uses swank so we need to start slime using McCLIM's swank. I feel like this phost went on a bit, so let's leave slime clim to the next one. * Cached plugd's pgbot 100daystooffloadroll :appendix: | screwtape | [[gopher://tilde.club/1/~screwtape/synthember-100days-tooffload/]] | | matto | [[gopher://box.matto.nl]] | | _82mhz | [[https://82mhz.net]] | | plugd | [[gopher://thelambdalab.xyz/1phlog/]] | | x1v | [[gopher://rawtext.club/1/~xiu/phlog/]] | | szczezuja | [[gopher://gopher.club:70/1/users/szczezuja/personal/]] | | prahou | [[gopher://triapul.cz/1/phlog]] | | pi31415 | [[gopher://tilde.pink/1/~bencollver/log/]] | | damarusama | [[gopher://gopher.club/1/users/gef/]] | * Also cat and jns and pkw and screwtape | [[gopher://baud.baby]] | [[gopher://embryonic.church]] | | [[gopher://gopher.linkerror.com]] | [[gopher://gopher.club/1/users/jns/]] | | [[gopher://g.d34d.net/1/~pkw/]] | gopher://gopher.club/1/users/screwtape/ |