Skip to content

Instantly share code, notes, and snippets.

@darkleaf
Last active August 23, 2024 09:02
Show Gist options
  • Save darkleaf/4687c4dc4a6d6810b28eac6f467ea144 to your computer and use it in GitHub Desktop.
Save darkleaf/4687c4dc4a6d6810b28eac6f467ea144 to your computer and use it in GitHub Desktop.
(ns experiments.str
(:import
(java.lang.reflect Field)
(java.io PushbackReader Reader)
(clojure.lang LispReader IFn)))
(set! *warn-on-reflection* true)
(def ^IFn/1 dispatchMacros
(let [field (.getDeclaredField LispReader "dispatchMacros")]
(.setAccessible field true)
(.get field nil)))
;; todo:
;; #$$ "atata" $$
;; #$aaa$ "atata" $aaa$ ;; " \"atata\" "
;; #$...$
(defn string-reader [^PushbackReader reader _ opts pendingForms]
(let [sb (StringBuilder.)]
(loop [ch (.read reader)]
#_(prn (char ch))
(case ch
-1 (throw (RuntimeException. "EOF"))
36 #_\$ (.toString sb)
(do (.append sb (char ch))
(recur (.read reader)))))))
(aset dispatchMacros \$ #'string-reader)
(def x #$
Всем "привет!!!"
"Я" могу тут кавычки писать
$)
;; disclaimer нужно балансировать кавычки
(print x)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment