PasteRack.org
Paste # 36499
2020-01-06 22:15:34

Fork as a new paste.

Paste viewed 480 times.


Embed:

  1. #lang racket
  2.  
  3. (define-syntax a-new-form
  4.   (lambda (stx)
  5.     (printf "syntax = ~a\n" (syntax->datum stx))
  6.     (syntax "this-is-transformed-result")))
  7.  
  8. (define-syntax trampoline-to-a-new-form
  9.   (lambda (stx)
  10.     (printf "trampoline!")
  11.     (syntax (a-new-form 'from-trampoline))))
  12.  
  13. (a-new-form A #x0B 'C "D")
  14.  
  15. trampoline-to-a-new-form
  16.  
  17. #|
  18.  S-expression `parse'/`expand'
  19.  compiled form 的同時做 macro expansion
  20.  
  21. (這裡以後用將 parse, macro expansion 以及 compile 都暫時看成同一件事)
  22.  
  23.  parse 時, 如果一個 form 裡面的 identifier 解析後指到普通的
  24. value binding, 結果是普通變數的 (compiled) AST representation
  25.  
  26. 若指到一個 transformer binding, 則此 binding 應該要綁定一個
  27. closure. 當前到這個 form  AST 會被傳給 closure,
  28. 然後 closure 的結果會插入到原 AST 位置. 新的 AST 會重新被 parse
  29. |#

=>

syntax = (a-new-form A 11 (quote C) D)

"this-is-transformed-result"

trampoline!syntax = (a-new-form (quote from-trampoline))

"this-is-transformed-result"