Enough to type nested syntax quotes

Is there a way to print the result of evaluating nested syntactic quotes in a legible way, like in SBCL? This would be useful when debugging nested syntax quotes when writing macros. For example, in Clojure 1.8,

(let [x '(1 2)] ``(~~@x))

estimated as

(clojure.core/seq (clojure.core/concat (clojure.core/list 1 2)))

In SBCL 1.3.6, the equivalent expression

(let ((x '(1 2))) ``(,,@x))

rated much more legible

`(,1 ,2)

The difference increases with more complex expressions. Are there any Clojure packages or other methods that can help in this situation? Currently, the best way I've found to debug complex syntax quotes is to convert them to Common Lisp, but this is a rather funny and slow approach.

+4
source share
1

syntaxQuote ( ) LispReader Clojure: https://github.com/clojure/clojure/blob/master/src/jvm/clojure/lang/LispReader.java#L1011

ISeq seq = RT.seq(form);
if(seq == null)
  ret = RT.cons(LIST,null);
else
  ret = RT.list(SEQ, RT.cons(CONCAT, sqExpandList(seq)));

, `(~ @'( )) :

(clojure.core/seq
  (clojure.core/concat
    (clojure.core/list (quote clojure.core/some))
    (clojure.core/list (quote clojure.core/list))))

REPL :

=> (some list)

`alone

`s => user/s ; it the ref of the symbol ok
``s 
=> (quote user/s) ; it the quoted ref 
```s
=> (clojure.core/seq ; now we manage a back-tick on a list
     (clojure.core/concat
       (clojure.core/list (quote quote)) 
       (clojure.core/list (quote user/s))))
````s
=> 
(clojure.core/seq ; oups! always a list we add a layer
 (clojure.core/concat
  (clojure.core/list (quote clojure.core/seq))
  (clojure.core/list
   (clojure.core/seq
    (clojure.core/concat
     (clojure.core/list (quote clojure.core/concat))
     (clojure.core/list
      (clojure.core/seq
       (clojure.core/concat
        (clojure.core/list (quote clojure.core/list))
        (clojure.core/list
         (clojure.core/seq
          (clojure.core/concat
           (clojure.core/list (quote quote))
           (clojure.core/list (quote quote))))))))
     (clojure.core/list
      (clojure.core/seq
       (clojure.core/concat
        (clojure.core/list (quote clojure.core/list))
        (clojure.core/list
         (clojure.core/seq
          (clojure.core/concat
           (clojure.core/list (quote quote))
           (clojure.core/list (quote user/s)))))))))))))

````~s => (clojure.core/seq ; same as ```s
            (clojure.core/concat
              (clojure.core/list (quote quote)) 
              (clojure.core/list (quote user/s))))
````~~s => (quote user/s) ; same as ``s

, ,

  • Clojure , (quote s) 's. , ,...
  • /. ,

    `` `` ~~ s = > '' s.

  • , ...;)

, `s is not 's.

LISP `s, .;)

(clojure.core/seq
  (clojure.core/concat
    (clojure.core/list (quote quote)) 
    (clojure.core/list (quote user/s))))

(seq 'user/s)

!!! , , , 'user/s.

`` `` s. :

(seq '(clojure.core/seq 'user/s))

''s, .

, toString of (quote...) "...

LISP 's s, `s - /s!!!

... , , `s , .

+1

Source: https://habr.com/ru/post/1662041/


All Articles