2016-03-13 13 views
5

Vorrei aggiungere alias alcune funzioni/macro racket2htdp, in modo da poterle tradurre in un'altra lingua per i miei figli.alias un nome per la clausola di una macro

Cose che sono funzioni Posso semplicemente alias con define. Ho problemi con la struttura big-bang; Se provo ad aggiungere alias on-tick ad esempio, ogni volta che ottengo big-bang: [new-name] clauses are not allowed within big-bang.

Ho provato varie varianti di define-syntax ma non riuscivo a farlo funzionare fino a quel momento (ho detto, sono un principiante completo di racket).

Qualcosa di simile a questo funziona (bene, ladja non è definito):

#lang racket 
(require 2htdp/universe 2htdp/image) 

(big-bang 0 
      (on-tick (lambda (x) (+ x 1))) 
      (to-draw (lambda (x) (place-image ladja 150 x (prazni-prostor 300 300)))) 
      (stop-when (lambda (x) (= x 300)))) 

Ma questo non lo fa (fa scattare l'errore):

#lang racket 
(require 2htdp/universe 2htdp/image) 

(define new-name on-tick) 

(big-bang 0 
      (new-name (lambda (x) (+ x 1))) 
      (to-draw (lambda (x) (place-image ladja 150 x (prazni-prostor 300 300)))) 
      (stop-when (lambda (x) (= x 300)))) 

vedo che big-bangis a macro, in modo che spiega il problema: immagino che dovrei essere in grado di forzare prima la valutazione della mia macro, in qualche modo?

risposta

7

Se si sta scrivendo un modulo che si richiede nel vostro programma, quindi è possibile utilizzare provide con rename-out per fornire un alias:

Nel big-bang-con-new-name.rkt:

#lang racket 
(require 2htdp/universe 2htdp/image) 

(provide big-bang 
     to-draw 
     stop-when 
     empty-scene 
     (rename-out [on-tick new-name])) 

Usandolo in un altro file:

#lang racket 

(require "big-bang-with-new-name.rkt") 

(big-bang 0 
      [new-name (lambda (x) (+ x 1))] 
      [to-draw (lambda (x) (empty-scene 200 200))] 
      [stop-when (lambda (x) (= x 300))]) 

Molte le macro utilizzano free-identifier=? di riconoscere parole chiave come questo. Rename transformers collaborare con free-identifier=? per creare alias esatti. Ciò significa che puoi anche definire new-name come un trasformatore di rinomina nel file principale come questo:

#lang racket 
(require 2htdp/universe 2htdp/image) 

(define-syntax new-name (make-rename-transformer #'on-tick)) 

(big-bang 0 
      [new-name (lambda (x) (+ x 1))] 
      [to-draw (lambda (x) (empty-scene 200 200))] 
      [stop-when (lambda (x) (= x 300))]) 
+0

funziona alla grande, grazie! –

Problemi correlati