ambrevar/syntax: Init.

master
Pierre Neidhardt 2021-01-20 18:22:49 +01:00
parent e9737b0686
commit 6cb52bb558
3 changed files with 56 additions and 12 deletions

View File

@ -47,6 +47,7 @@
#:ambrevar/file
#:ambrevar/guix
#:ambrevar/shell
#:ambrevar/syntax
#:ambrevar/syspack
#:ambrevar/patches/cmd))

View File

@ -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

View File

@ -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))