2016-03-13 2 views
5

Я хотел бы написать псевдоним racket2htdp функции/макросы, чтобы я мог перевести их на другой язык для своих детей.alias имя для макроса

Вещи, которые являются функциями Я могу просто написать псевдоним define. У меня возникли проблемы с структурой big-bang; Если я пытаюсь сделать псевдоним on-tick, например, каждый раз я получаю big-bang: [new-name] clauses are not allowed within big-bang.

Я пробовал различные варианты define-syntax, но я не мог заставить его работать до сих пор (я сказал, что я полный новичок-новичок).

Что-то вроде это работает (ну, ladja не определен):

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

Но это не (вызывает ошибку):

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

Я вижу, что big-bangis a macro, так что объясняет проблему: я думаю, мне нужно было бы заставить мой макрос оцениваться первым, каким-то образом?

ответ

7

Если вы пишете модуль, который требовал бы в вашу программу, то вы можете использовать provide с rename-out предоставить псевдоним:

В большом-паф-с-новым-name.rkt:

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

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

Используя его в другом файле:

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

Многие макросы используют free-identifier=? распознавать ключевые слова, как это. Rename transformers сотрудничать с free-identifier=? для создания точных псевдонимов. Это означает, что вы также можете определить new-name в качестве переименованного трансформатора в основном файле следующим образом:

#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

работает отлично, спасибо! –

Смежные вопросы