s-expr-example.rkt 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #lang racket
  2. (require racket/match)
  3. (require racket/fixnum)
  4. (define assert
  5. (lambda (msg b)
  6. (if (not b)
  7. (begin
  8. (display "ERROR: ")
  9. (display msg)
  10. (newline))
  11. (void))))
  12. (define ast1.4 `(- 8))
  13. (define ast1.1 `(+ 50 ,ast1.4))
  14. (match ast1.1
  15. [`(,op ,child1 ,child2)
  16. (print op) (newline)
  17. (print child1) (newline)
  18. (print child2)])
  19. (define (arith-kind arith)
  20. (match arith
  21. [(? fixnum?) `int]
  22. [`(- ,c1) `neg]
  23. [`(+ ,c1 ,c2) `add]))
  24. (arith-kind `50)
  25. (arith-kind `(- 8))
  26. (arith-kind `(+ 50 (- 8)))
  27. (define (arith? sexp)
  28. (match sexp
  29. [(? fixnum?) #t]
  30. [`(+ ,e1 ,e2)
  31. (and (arith? e1) (arith? e2))]
  32. [`(- ,e) (arith? e)]
  33. [else #f]))
  34. (arith? `(+ 50 (- 8)))
  35. (arith? `(- 50 (+ 8)))
  36. (define (interp-arith e)
  37. (match e
  38. [(? fixnum?) e]
  39. [`(read)
  40. (let ([r (read)])
  41. (cond [(fixnum? r) r]
  42. [else (error 'interp-arith "input was not an integer" r)]))]
  43. [`(- ,e)
  44. (fx- 0 (interp-arith e))]
  45. [`(+ ,e1 ,e2)
  46. (fx+ (interp-arith e1) (interp-arith e2))]
  47. ))
  48. (interp-arith ast1.1)
  49. ;(interp-arith `(+ (read) (- 8)))
  50. (define (pe-neg r)
  51. (match r
  52. [(? fixnum?) (fx- 0 r)]
  53. [else `(- ,r)]
  54. ))
  55. (define (pe-add r1 r2)
  56. (match (list r1 r2)
  57. [`(,n1 ,n2)
  58. #:when (and (fixnum? n1) (fixnum? n2))
  59. (fx+ r1 r2)]
  60. [else
  61. `(+ ,r1 ,r2)]
  62. ))
  63. (define (pe-arith e)
  64. (match e
  65. [(? fixnum?) e]
  66. [`(read)
  67. `(read)]
  68. [`(- ,e1)
  69. (pe-neg (pe-arith e1))]
  70. [`(+ ,e1 ,e2)
  71. (pe-add (pe-arith e1) (pe-arith e2))]
  72. ))
  73. ;; e ::= (read) | (- (read)) | (+ e e)
  74. ;; r ::= n | (+ n e) | e
  75. (define (pe-neg2 r)
  76. (match r
  77. [(? fixnum?) (fx- 0 r)]
  78. [`(+ ,n ,e2)
  79. #:when (fixnum? n)
  80. `(+ ,(fx- 0 n) ,(pe-neg2 e2))]
  81. [`(read) `(- (read))]
  82. [`(- ,e2) e2]
  83. [`(+ ,e1 ,e2)
  84. `(+ ,(pe-neg2 e1) ,(pe-neg2 e2))]
  85. ))
  86. (define (pe-add2 r1 r2)
  87. (match r1
  88. [(? fixnum?)
  89. (match r2
  90. [(? fixnum?) (fx+ r1 r2)]
  91. [`(+ ,n2 ,e2) #:when (fixnum? n2)
  92. `(+ ,(fx+ r1 n2) ,e2)]
  93. [else `(+ ,r1 ,r2)])]
  94. [`(+ ,n1 ,e1)
  95. (match r2
  96. [(? fixnum?) `(+ (fx+ n1 r2) ,e1)]
  97. [`(+ ,n2 ,e2) #:when (fixnum? n2)
  98. `(+ ,(fx+ n1 n2) (+ ,e1 ,e2))]
  99. [else `(+ ,r1 ,r2)])]
  100. [else
  101. (match r2
  102. [(? fixnum?) `(+ ,r2 ,r1)]
  103. [else `(+ ,r1 ,r2)])]
  104. ))
  105. (define (pe-arith2 e)
  106. (match e
  107. [(? fixnum?) e]
  108. [`(read)
  109. `(read)]
  110. [`(- ,e1)
  111. (pe-neg2 (pe-arith2 e1))]
  112. [`(+ ,e1 ,e2)
  113. (pe-add2 (pe-arith2 e1) (pe-arith2 e2))]
  114. ))
  115. (define (test-pe pe p)
  116. (assert "testing pe-arith" (equal? (interp-arith p)
  117. (interp-arith (pe p)))))
  118. (test-pe pe-arith `(+ (read) (- (+ 5 3))))
  119. (test-pe pe-arith `(+ 1 (+ (read) 1)))
  120. (test-pe pe-arith `(- (+ (read) (- 5))))
  121. (test-pe pe-arith2 `(+ (read) (- (+ 5 3))))
  122. (test-pe pe-arith2 `(+ 1 (+ (read) 1)))
  123. (test-pe pe-arith2 `(- (+ (read) (- 5))))