ambrevar/syntax: Init.
parent
e9737b0686
commit
6cb52bb558
|
@ -47,6 +47,7 @@
|
|||
#:ambrevar/file
|
||||
#:ambrevar/guix
|
||||
#:ambrevar/shell
|
||||
#:ambrevar/syntax
|
||||
#:ambrevar/syspack
|
||||
#:ambrevar/patches/cmd))
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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))
|
Loading…
Reference in New Issue