2016-03-13 1 views
5

Ich möchte einige racket2htdp Funktionen/Makros aliasieren, so dass ich sie in einer anderen Sprache für meine Kinder übersetzen kann.Alias ​​ein Name für die Klausel eines Makros

Dinge, die sind Funktionen kann ich einfach alias mit define. Ich habe Probleme mit der big-bang Struktur; Wenn ich zum Beispiel versuche, Alias ​​on-tick zu aliasieren, bekomme ich jedesmal big-bang: [new-name] clauses are not allowed within big-bang.

Ich habe verschiedene Varianten von define-syntax versucht, aber ich konnte es bisher nicht funktionieren lassen (das sagte, ich bin ein kompletter Schläger Neuling).

So etwas wie dies funktioniert (na ja, ist ladja nicht definiert):

#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)))) 

Aber dies nicht (löst den Fehler):

#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)))) 

Ich sehe, dass big-bangis a macro, so dass erklärt das Problem: Ich denke, ich müsste in der Lage sein, mein Makro zuerst zu evaluieren, irgendwie?

Antwort

7

Wenn Sie einen Modul gerade schreiben, die Sie in Ihr Programm benötigen würden, dann können Sie provide mit rename-out verwenden, um einen Alias ​​zu bieten:

In Big-Bang-mit-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])) 

verwenden es in einer anderen Datei:

#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))]) 

Viele Makros free-identifier=? verwenden Schlüsselwörter wie dies zu erkennen. Rename transformers kooperieren mit free-identifier=?, um genaue Aliase zu erstellen. Das heißt, Sie können auch new-name als Umbenennung Transformator in der Hauptdatei wie folgt definieren:

#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

funktioniert gut, danke! –