
    ^h                         S r SSKrSSKrSSKJr  SSKr " S S\R                  5      rS\	S\\R                  /\4   4S jr " S	 S
5      r\" 5       r " S S\R                  5      rg)a  
Example of an quasiquoter for Pyccolo, similar to MacroPy's.
Ref: https://macropy3.readthedocs.io/en/latest/reference.html#quasiquote

Example:
```
a = 10
b = 2
with Quasiquoter:
    pyc.eval("q[1 + u[a + b]]")
>>> BinOp(Add, left=Num(1), right=Num(12))
```
    N)Callablec                   <    \ rS rSrS rS\R                  4S jrSrg)_QuasiquoteTransformer   c                     Xl         X l        g N_global_env
_local_env)self
global_env	local_envs      U/home/james-whalen/.local/lib/python3.13/site-packages/pyccolo/examples/quasiquote.py__init___QuasiquoteTransformer.__init__   s    %#    nodec                 "   [        UR                  [        R                  5      (       ae  UR                  R                  [
        R                  5       R                  S1-
  ;   a+  [        R                  " XR                  U R                  5      $ U$ )Nq)
isinstancevalueastNameidQuasiquoterinstancemacrospycevalr
   r   r   r   s     r   visit_Subscript&_QuasiquoteTransformer.visit_Subscript   sb    JJ
 
jjmm{335<<uDD88D"2"2DOODDKr   r	   N)	__name__
__module____qualname____firstlineno__r   r   	Subscriptr!   __static_attributes__ r   r   r   r      s    $CMM r   r   namereturnc                    ^  U 4S j$ )Nc                    > [        U [        R                  5      =(       aD    [        U R                  [        R                  5      =(       a    U R                  R
                  T:H  $ r   )r   r   r'   r   r   r   )r   r*   s    r   <lambda>is_macro.<locals>.<lambda>&   sA    Zcmm4 "tzz388,"JJMMT!"r   r)   )r*   s   `r   is_macror0   $   s    	"r   c                       \ rS rSrS rSrg)_IdentitySubscript,   c                     U$ r   r)   )r   items     r   __getitem___IdentitySubscript.__getitem__-   s    r   r)   N)r#   r$   r%   r&   r6   r(   r)   r   r   r2   r2   ,   s    r   r2   c                     ^  \ rS rSrSrU 4S jrSS jrSS jr\R                  " \
" S5      SS9S 5       r\R                  " \
" S	5      SS9S
 5       r\R                  " \
" S5      SS9S 5       r\R                  " \
" S5      SS9S 5       r\R                  " \
" S5      SS9S 5       rS r\R$                  " \SS9S 5       rSrU =r$ )r   4   Tc                 8   > [         TU ]  " U0 UD6  1 SkU l        g )N>   r   ur*   ast_listast_literal)superr   r   )r   argskwargs	__class__s      r   r   Quasiquoter.__init__7   s    $)&)Cr   c                 n    SS K nU R                   H!  n[        X5      (       a  M  [        XS 5        M#     g Nr   )builtinsr   hasattrsetattrr   rE   macros      r   enter_tracing_hookQuasiquoter.enter_tracing_hook;   s*     [[E8++. !r   c                 l    SS K nU R                   H   n[        X5      (       d  M  [        X5        M"     g rD   )rE   r   rF   delattrrH   s      r   exit_tracing_hookQuasiquoter.exit_tracing_hookC   s&    [[Ex''( !r   r   )when	reentrantc                    ^^ UR                   m[        UR                   [        R                  5      (       a  TR                  mUU4S j$ )Nc                     > [        T R                  T R                  5      R                  [        R
                  " T5      5      $ r   )r   	f_globalsf_localsvisitcopydeepcopy)frameto_visits   r   r.   +Quasiquoter.quote_handler.<locals>.<lambda>O   s,    -eoou~~NTTMM(#
r   )slicer   r   Indexr   )r   _retr   rY   ___rZ   s      `  @r   quote_handlerQuasiquoter.quote_handlerJ   s4    ::djj#)),,~~H
 	
r   r;   c                 H    [         R                  " S[        U5       S35      $ Nzq[])r   r   reprr   retr_   r`   s       r   unquote_handlerQuasiquoter.unquote_handlerS   s    xx"T#YKq)**r   r*   c                 d    [        U[        5      (       d   e[        R                  " SU S35      $ rd   )r   strr   r   rg   s       r   name_handlerQuasiquoter.name_handlerW   s,    #s####xx"SE$$r   r=   c                 H    [        U[        R                  5      (       d   eU$ r   )r   r   ASTrg   s       r   ast_literal_handlerQuasiquoter.ast_literal_handler\   s      #sww''''
r   r<   c                 <    [         R                  " [        U5      S9$ )N)elts)r   Listlistrg   s       r   ast_list_handlerQuasiquoter.ast_list_handlerb   s    xxT#Y''r   c                 B   ^ [        U4S jU R                   5       5      $ )Nc              3   F   >#    U  H  n[        U5      " T5      v   M     g 7fr   )r0   ).0mr   s     r   	<genexpr>+Quasiquoter.is_any_macro.<locals>.<genexpr>g   s     :k8A;t$$ks   !)anyr   r    s    `r   is_any_macroQuasiquoter.is_any_macrof   s    :dkk:::r   c                     [         $ r   )_identity_subscript)r   r^   r_   r`   s       r   load_macro_resultQuasiquoter.load_macro_resulti   s    ""r   )r   )r+   N)r#   r$   r%   r&   allow_reentrant_eventsr   rJ   rN   r   before_subscript_slicer0   ra   after_subscript_sliceri   rm   rq   rw   r   before_subscript_loadr   r(   __classcell__)rA   s   @r   r   r   4   s   !D/) 	Xc]dC
 D
 	HSMTB+ C+ 	HV$4E% F% 	H]$;tL M
 	HZ$8DI( J(; 	LDA# B#r   r   )__doc__r   rW   typingr   pyccolor   NodeTransformerr   rl   rp   boolr0   r2   r   
BaseTracerr   r)   r   r   <module>r      sq       S00 3 8SWWItO4  
 )* 7##.. 7#r   