Guest User

Untitled

a guest
Mar 23rd, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.10 KB | None | 0 0
  1. #lang hackett
  2.  
  3. (require (only-in racket module quote let-syntax define-for-syntax define-syntax for-syntax)
  4. (for-syntax racket syntax/parse))
  5.  
  6. ; Helper for syntax stuff later
  7. (module deflang racket
  8. (require (for-syntax syntax/parse))
  9. (provide define-language define-language-syntax)
  10.  
  11. (begin-for-syntax
  12. (struct language (introducer)
  13. #:property prop:procedure
  14. (lambda (inst stx)
  15. (syntax-parse stx
  16. [(_ e)
  17. ((language-introducer inst) #'e)]))))
  18.  
  19. (define-syntax define-language
  20. (syntax-parser
  21. [(_ name)
  22. #'(define-syntax name
  23. (language (make-syntax-introducer)))]))
  24.  
  25. (define-syntax define-language-syntax
  26. (syntax-parser
  27. [(_ lang form transformer)
  28. (define intro
  29. (language-introducer
  30. (syntax-local-value #'lang)))
  31. #`(define-syntax #,(intro #'form)
  32. transformer)])))
  33.  
  34. (require 'deflang)
  35.  
  36. ; Define a language interface with tagless final
  37.  
  38. (class (Symantics repr)
  39. [int : (-> Integer (repr Integer))]
  40. [add : (-> (repr Integer)
  41. (-> (repr Integer)
  42. (repr Integer)))]
  43. [lam : (∀ (a b)
  44. (-> (-> (repr a) (repr b))
  45. (repr (-> a b))))]
  46. [app : (∀ (a b)
  47. (-> (repr (-> a b))
  48. (-> (repr a)
  49. (repr b))))])
  50.  
  51. ; An interpretation that evaluates terms
  52. ; metacircularly with Hackett
  53.  
  54. (data (R a) (R a))
  55.  
  56. (defn unR : (∀ (a) (-> (R a) a))
  57. [[(R x)] x])
  58.  
  59. (instance (Symantics R)
  60. [int (λ [x] (R x))]
  61. [add (λ [e1 e2] (R (+ (unR e1)
  62. (unR e2))))]
  63. [lam (λ [f] (R (λ [x] (unR (f (R x))))))]
  64. [app (λ [e1 e2] (R ((unR e1) (unR e2))))])
  65.  
  66. (def foo : (∀ [repr] (Symantics repr) => (repr Integer))
  67. (app
  68. (lam (λ [x] (add (app x (int 1)) (int 2))))
  69. (lam (λ [x] (int 1)))))
  70.  
  71. ; Add syntactic sugar
  72.  
  73. (define-language tagless-lang)
  74.  
  75. (define-language-syntax tagless-lang λ
  76. (syntax-parser
  77. [(_ (x) body)
  78. #'(#%app lam (λ [x] body))]))
  79.  
  80. (define-language-syntax tagless-lang #%datum
  81. (syntax-parser
  82. [(_ ~rest e)
  83. #`(#%app int #,(cons #'#%datum #'e))]))
  84.  
  85. (define-language-syntax tagless-lang #%app
  86. (syntax-parser
  87. [(_ e1 e2)
  88. #'(#%app app e1 e2)]))
  89.  
  90. (define-language-syntax tagless-lang +
  91. (syntax-parser
  92. [(_ e1 e2)
  93. #`(#%app add e1 e2)]))
  94.  
  95. ; Now we can write terms of the tagless final DSL
  96. ; with nice syntax
  97. (def foo2 : (∀ [repr] (Symantics repr) => (repr Integer))
  98. (tagless-lang
  99. ((λ [x] (+ (x 1) 2))
  100. (λ [x] 1))))
  101.  
  102. ; Extend the language with multiplication
  103.  
  104. ; Interface
  105. (class (MulSym repr)
  106. [mul : (-> (repr Integer)
  107. (-> (repr Integer)
  108. (repr Integer)))])
  109.  
  110. ; Interpreter
  111. (instance (MulSym R)
  112. [mul (λ [e1 e2] (R (* (unR e1) (unR e2))))])
  113.  
  114. ; Syntax
  115. (define-language-syntax tagless-lang *
  116. (syntax-parser
  117. [(_ e1 e2)
  118. #`(#%app mul e1 e2)]))
  119.  
  120. ; And an example program. With better inference
  121. ; we wouldn't have to write the type.
  122. (def foo3 : (∀ [repr] (Symantics repr) (MulSym repr) => (repr Integer))
  123. (tagless-lang
  124. (* 5
  125. ((λ [x] (+ (x 1) 2))
  126. (λ [x] 1)))))
Add Comment
Please, Sign In to add comment