ambrevar/syntax: Init.
parent
e9737b0686
commit
6cb52bb558
|
@ -47,6 +47,7 @@
|
||||||
#:ambrevar/file
|
#:ambrevar/file
|
||||||
#:ambrevar/guix
|
#:ambrevar/guix
|
||||||
#:ambrevar/shell
|
#:ambrevar/shell
|
||||||
|
#:ambrevar/syntax
|
||||||
#:ambrevar/syspack
|
#:ambrevar/syspack
|
||||||
#:ambrevar/patches/cmd))
|
#:ambrevar/patches/cmd))
|
||||||
|
|
||||||
|
|
|
@ -283,18 +283,6 @@ Return process name as second value."
|
||||||
"Return checksum of FILE."
|
"Return checksum of FILE."
|
||||||
(first (first (tokenize (cmd:$cmd "sha1sum" (write-to-string (ambrevar/file:path 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)
|
(export-always 'move-file)
|
||||||
(defun move-file (source destination)
|
(defun move-file (source destination)
|
||||||
"`rename-file' does not work cross-device, in particular it does not work on
|
"`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