[racket] How to make an identifier that will have a certain binding no matter what phase level it's referenced at?

From: Roman Klochkov (kalimehtar at mail.ru)
Date: Sun Jul 27 13:20:30 EDT 2014

It is bound to racket/base lambda. More correct, phase0 lambda in racket/base.
But when you call it in level 2, there are no level 0 lambda.

Minimal similar test-case:
---------------
(module m racket/base
  (provide test-stx)
  (define (test-stx) #'(lambda (x) x)))
(require (for-syntax 'm))
(define-syntax (test stx) (test-stx))
test

. lambda: unbound identifier;
 also, no #%app syntax transformer is bound in: lambda
----------------

Minimal correct case:
------------------
(module m racket/base
  (provide test-stx)
  (define (test-stx a l)
    (with-syntax ([#%app a]
                  [lambda l])
      #'(lambda (x) x))))
(require (for-syntax 'm))
(define-syntax (test stx) (test-stx #'#%app #'lambda))
test
--------------------

So you have to somehow give correct #'lambda and #'#%app into your macros.


Sun, 27 Jul 2014 12:21:36 -0400 от "Alexander D. Knauth" <alexander at knauth.org>:
>I just tried to try it and see if it worked, when I realized that it won’t work because I can’t use quote-syntax.  
>
>Is there any way to get around that?  And would it even work anyway?  
>On Jul 27, 2014, at 6:59 AM, Roman Klochkov < kalimehtar at mail.ru > wrote:
>>Maybe via " Cross-Phase Persistent Module Declarations"  http://docs.racket-lang.org/reference/syntax-model.html#%28part._cross-phase._persistent-grammar%29   ?
>>
>>
>>Thu, 24 Jul 2014 21:24:20 -0400 от "Alexander D. Knauth" < alexander at knauth.org >:
>>>How can I make an identifier that will have a certain binding no matter what phase level it's referenced at?
>>>
>>>For example if I’m making a reader extension that will produce a lambda expression, how do I make it so that the lambda expression will be able to exist at any phase level?
>>>
>>>For example this program using #lang rackjure doesn’t work:
>>>#lang rackjure
>>>(require (for-meta 1 racket/base)
>>>         (for-meta 2 racket/base)
>>>         (for-meta 3 racket/base)
>>>         (for-meta 4 racket/base)
>>>         )
>>>                                                                                             
>>>#λ(* 2 %) ; works, produces approx. (lambda (%) (* 2 %))
>>>(begin-for-syntax
>>>  (begin-for-syntax
>>>    #λ(* 2 %) ; lambda: unbound identifier at phase 2;
>>>    ;         ;   also, no #%app syntax transformer is bound in: lambda
>>>    ))
>>>
>>>Is there any way to construct an identifier that would be bound to lambda from racket/base no matter what phase level it’s used in?
>>>
>>>
>>>____________________
>>>  Racket Users list:
>>>   http://lists.racket-lang.org/users
>>>
>>
>>
>>--  
>>Roman Klochkov


-- 
Roman Klochkov
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.racket-lang.org/users/archive/attachments/20140727/f05edbe4/attachment.html>

Posted on the users mailing list.