diff --git a/.local/share/common-lisp/source/ambrevar/all.lisp b/.local/share/common-lisp/source/ambrevar/all.lisp index 21d5165a..9b0716b0 100644 --- a/.local/share/common-lisp/source/ambrevar/all.lisp +++ b/.local/share/common-lisp/source/ambrevar/all.lisp @@ -47,6 +47,7 @@ #:ambrevar/file #:ambrevar/guix #:ambrevar/shell + #:ambrevar/syntax #:ambrevar/syspack #:ambrevar/patches/cmd)) diff --git a/.local/share/common-lisp/source/ambrevar/shell.lisp b/.local/share/common-lisp/source/ambrevar/shell.lisp index df1ea0d7..b146cbc8 100644 --- a/.local/share/common-lisp/source/ambrevar/shell.lisp +++ b/.local/share/common-lisp/source/ambrevar/shell.lisp @@ -283,18 +283,6 @@ Return process name as second value." "Return checksum of FILE." (first (first (tokenize (cmd:$cmd "sha1sum" (write-to-string (ambrevar/file:path file))))))) -(export-always 'toggle-interpol-readtable) -(defun toggle-interpol-readtable () - (if (eq *readtable* (named-readtables:find-readtable :interpol-syntax)) - (named-readtables:in-readtable :standard) - (named-readtables:in-readtable :interpol-syntax))) - -(export-always 'toggle-clesh-readtable) -(defun toggle-clesh-readtable () - (if (eq *readtable* (named-readtables:find-readtable 'clesh:syntax)) - (named-readtables:in-readtable :standard) - (named-readtables:in-readtable clesh:syntax))) - (export-always 'move-file) (defun move-file (source destination) "`rename-file' does not work cross-device, in particular it does not work on diff --git a/.local/share/common-lisp/source/ambrevar/syntax.lisp b/.local/share/common-lisp/source/ambrevar/syntax.lisp new file mode 100644 index 00000000..702c5154 --- /dev/null +++ b/.local/share/common-lisp/source/ambrevar/syntax.lisp @@ -0,0 +1,55 @@ +(uiop:define-package ambrevar/syntax + (:documentation "Syntax table.") + (:use #:common-lisp) + (:use #:trivia) + (:import-from #:ambrevar/shell) + (:import-from #:ambrevar/file) + (:import-from #:serapeum #:export-always)) +(in-package ambrevar/syntax) +(eval-when (:compile-toplevel :load-toplevel :execute) + (trivial-package-local-nicknames:add-package-local-nickname :alex :alexandria) + (trivial-package-local-nicknames:add-package-local-nickname :sera :serapeum)) + +(defun read-until (stream delimiter) + "Return the string read until DELIMITER." + (concatenate 'string + (loop :for char = (read-char stream nil :eof) + :while (and (not (eq char :eof)) + (not (char= char delimiter))) + :collect char))) + +(defun cmd-reader (stream char1 char2) + (declare (ignore char1 char2)) + (cmd:cmd (read-until stream #\newline))) + +(defun $cmd-reader (stream char1 char2) + (declare (ignore char1 char2)) + (cmd:$cmd (read-until stream #\newline))) + +(defun sh-reader (stream char1 char2) + (declare (ignore char1 char2)) + (let ((next-char (read-char stream nil :eof))) + (str:string-case (string next-char) + ("#" + (ambrevar/shell:sh (read-until stream #\newline))) + ("!" + (ambrevar/shell:sh (read-until stream #\newline))) + ("$" + (ambrevar/shell:$sh (read-until stream #\newline))) + (otherwise + (ambrevar/shell:sh (str:concat (string next-char) + (read-until stream #\newline))))))) + +(defun file-reader (stream char1 char2) + (declare (ignore char1 char2)) + (read-until stream #\") + (ambrevar/file:file (read-until stream #\"))) + +(export-always 'syntax) +(named-readtables:defreadtable syntax + (:merge :standard) + (:dispatch-macro-char #\# #\# #'sh-reader) + (:dispatch-macro-char #\# #\$ #'$cmd-reader) + (:dispatch-macro-char #\# #\! #'cmd-reader) + (:dispatch-macro-char #\# #\? #'interpol:interpol-reader) + (:dispatch-macro-char #\# #\f #'file-reader))