Compare commits
2 Commits
9096b01a71
...
cbf4c267df
Author | SHA1 | Date |
---|---|---|
~keith | cbf4c267df | |
~keith | a3337c1ad7 |
|
@ -0,0 +1,10 @@
|
|||
;;;; superfluous-parentheses.asd
|
||||
;;;; system definition file
|
||||
|
||||
(defsystem "superfluous-parentheses"
|
||||
:description "Syntactic sugar to allow [] and {} in place of normal parentheses."
|
||||
:version "1.0"
|
||||
:author "keith"
|
||||
:homepage "https://bytes.keithhacks.cyou/keith/superfluous-parentheses"
|
||||
:license "Public Domain/CC0"
|
||||
:components ((:file "superfluous-parentheses")))
|
|
@ -0,0 +1,47 @@
|
|||
;;;; superfluous-parentheses.lisp
|
||||
;;;; Adds support for [] and {} in place of normal parentheses
|
||||
(defpackage superfluous-parentheses
|
||||
(:use common-lisp))
|
||||
(in-package superfluous-parentheses)
|
||||
|
||||
(define-condition simple-reader-error (simple-condition reader-error)
|
||||
())
|
||||
|
||||
(defun read-bracketed-list (stream begin-char)
|
||||
(let* ((end-char (cond ((char= begin-char #\[) #\])
|
||||
((char= begin-char #\{) #\})
|
||||
(t (error 'simple-reader-error
|
||||
:stream stream
|
||||
:format-control "Invalid bracket ~S"
|
||||
:format-arguments (list begin-char)))))
|
||||
(list-body (loop for next-char = (peek-char t stream t nil t)
|
||||
until (or (char= next-char end-char) (char= next-char #\.))
|
||||
collect (read stream t nil t)))
|
||||
(last-char (read-char stream t nil t))) ;; discard the last peeked character
|
||||
(cond ((char= last-char end-char) list-body)
|
||||
((char= last-char #\.)
|
||||
(unless list-body
|
||||
(error 'simple-reader-error
|
||||
:stream stream
|
||||
:format-control "Nothing before . in list."
|
||||
:format-arguments nil))
|
||||
;; set the CDR of the list
|
||||
(rplacd (last list-body) (read stream t nil t))
|
||||
;; skip past whitespace
|
||||
(peek-char t stream t nil t)
|
||||
(unless (char= (read-char stream t nil t) end-char)
|
||||
(error 'simple-reader-error
|
||||
:stream stream
|
||||
:format-control "Multiple objects after . in list."
|
||||
:format-arguments nil))
|
||||
list-body)
|
||||
(t (error 'simple-reader-error
|
||||
:stream stream
|
||||
:format-control "Expected ~S or ., but got ~S."
|
||||
:format-arguments (list end-char last-char))))))
|
||||
|
||||
(set-macro-character #\[ #'read-bracketed-list)
|
||||
(set-macro-character #\] (get-macro-character #\)))
|
||||
|
||||
(set-macro-character #\{ #'read-bracketed-list)
|
||||
(set-macro-character #\} (get-macro-character #\)))
|
Loading…
Reference in New Issue