Advertisement
Guest User

Untitled

a guest
Nov 28th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Racket 3.54 KB | None | 0 0
  1. #lang racket
  2. (require (for-syntax syntax/parse
  3.                      racket/syntax
  4.                     syntax/transformer)
  5.          racket/stxparam
  6.          racket/unsafe/ops)
  7.  
  8. (provide (rename-out [@%module-begin #%module-begin]
  9.                      [@%top-interaction #%top-interaction]
  10.                      [@%datum #%datum]
  11.                      [@define define]
  12.                      [@begin do]
  13.                      [@+ +] [@- -] [@* *] [@/ /] [@< <] [@> >] [@= =]
  14.                      [@if if]
  15.                      [@while while]
  16.                      [@display .d]
  17.                      [@show .s])
  18.          dup drop swap)
  19.  
  20.  
  21. (define-syntax-parameter stack
  22.   (λ (stx)
  23.     (raise-syntax-error #f "stack-var not set" stx)))
  24.  
  25. (define-syntax ==>
  26.   (syntax-parser
  27.     [(_ s-expr next-expr)
  28.      #:with s (generate-temporary #'s-expr)
  29.      #'(let ([s s-expr])
  30.          (syntax-parameterize
  31.              ([stack (make-rename-transformer #'s)])
  32.            next-expr))]))
  33.  
  34. (define global-s
  35.   (make-parameter '()))
  36.  
  37.  
  38. (define-syntax @%module-begin
  39.   (syntax-parser
  40.     #:literals (@define)
  41.     [(_ (@define ~! op:id inner-e ...) ...
  42.         toplvl-e ...)
  43.  
  44.      #'(#%module-begin
  45.         (define-op op
  46.           #:func (λ (s) (@begin s inner-e ...)))
  47.         ...
  48.  
  49.         (global-s (@begin (global-s) toplvl-e ...)))]))
  50.  
  51. (define-syntax @%top-interaction
  52.   (syntax-parser
  53.     [(_ . e)
  54.      #'(global-s (==> (global-s) e))]))
  55.  
  56. (define-syntax @define
  57.   (λ (stx)
  58.     (raise-syntax-error #f "invalid use outside of toplevel" stx)))
  59.  
  60. (define-syntax @begin
  61.   (syntax-parser
  62.     [(_) #'stack]
  63.     [(_ e) #'e]
  64.     [(_ e0 e ...) #'(==> e0 (@begin e ...))]))
  65.  
  66. (define-syntax @%datum
  67.   (syntax-parser
  68.     [(_ . d) #'(cons 'd stack)]))
  69.  
  70. (define-syntax @if
  71.   (syntax-parser
  72.     [(_ [e1 ...]
  73.         [e2 ...])
  74.      #'(br- stack
  75.             (λ (s1) (@begin s1 e1 ...))
  76.             (λ (s2) (@begin s2 e2 ...)))]))
  77.  
  78. (define-syntax @while
  79.   (syntax-parser
  80.     [(_ [e1 ...] e2 ...)
  81.      #'(let loop ([s stack])
  82.          (br- (@begin s e1 ...)
  83.               (λ (s-) (loop (@begin s- e2 ...)))
  84.               values))]))
  85.  
  86. (define (br- s f g)
  87.   (match s
  88.     [(cons #t s-) (f s-)]
  89.     [(cons #f s-) (g s-)]))
  90.  
  91.  
  92. (define-syntax define-op
  93.   (syntax-parser
  94.     #:datum-literals (=> ->)
  95.     [(_ name:id x ... => y ...)
  96.      #:with name- (generate-temporary #'name)
  97.      #:with (x* ...) (reverse (syntax->list #'[x ...]))
  98.      #:with (y* ...) (reverse (syntax->list #'[y ...]))
  99.      #'(begin
  100.          (define/match (name- s)
  101.            [[(list* x* ... s-)] (list* y* ... s-)])
  102.          (define-op name #:func name-))]
  103.  
  104.     [(_ name:id #:func f)
  105.      #'(define-syntax name
  106.          (make-variable-like-transformer #'(f stack)))]
  107.  
  108.     [(_ name:id x ... -> f)
  109.      #'(define-op name x ... => (f x ...))]))
  110.  
  111. (define-syntax-rule (define-ops [name . x/o] ...)
  112.   (begin (define-op name . x/o) ...))
  113.  
  114. (define-ops
  115.   [dup    x => x x]
  116.   [drop   x => ]
  117.   [swap   x y => y x]
  118.   [@+     n m -> unsafe-fx+]
  119.   [@-     n m -> unsafe-fx-]
  120.   [@*     n m -> unsafe-fx*]
  121.   [@/     n m -> unsafe-fxquotient]
  122.   [@<     n m -> unsafe-fx<]
  123.   [@>     n m -> unsafe-fx>]
  124.   [@=     n m -> unsafe-fx=]
  125.   [@display #:func (λ (s)
  126.                      (displayln (car s))
  127.                      (cdr s))]
  128.   [@show #:func (λ (s)
  129.                   (displayln (string-join
  130.                               (for/fold ([z '()])
  131.                                         ([x (in-list s)])
  132.                                 (cons (~a x) z))))
  133.                   s)])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement