Advertisement
Guest User

Untitled

a guest
Nov 26th, 2014
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.25 KB | None | 0 0
  1. (define parse
  2. (let ((run
  3. (compose-patterns
  4. (pattern-rule
  5. (? 'c simple-const?)
  6. (lambda (c) `(const ,c)))
  7. (pattern-rule
  8. `(quote ,(? 'c))
  9. (lambda (c) `(const ,c)))
  10. (pattern-rule
  11. (? 'v var?)
  12. (lambda (v) `(var ,v)))
  13. (pattern-rule
  14. `(if ,(? 'test) ,(? 'dit) ,(? 'dif))
  15. (lambda (test dit dif)
  16. `(if3 ,(parse test) ,(parse dit) ,(parse dif))))
  17. (pattern-rule
  18. `(if ,(? 'test) ,(? 'dit))
  19. (lambda (test dit)
  20. `(if3 ,(parse test) ,(parse dit) (const ,*void-object*))))
  21. (pattern-rule
  22. `(lambda ,(? 'v) ,(? 'e) . ,(? 'es list?))
  23. (lambda (v e es)
  24. (check-lambda v
  25. (lambda () `(lambda-simple ,v ,(parse (beginify (cons e es)))))
  26. (lambda (s a) `(lambda-opt ,s ,a ,(parse (beginify (cons e es)))))
  27. (lambda () `(lambda-variadic ,v ,(parse (beginify (cons e es)))))
  28. )))
  29. (pattern-rule
  30. `(define ,(? 'var var?) ,(? 'value))
  31. (lambda (var value)
  32. `(define ,(parse var) ,(parse value))))
  33. (pattern-rule
  34. `(define (,(? 'var var?) . ,(? 'vars)) ,(? 'value))
  35. (lambda (var vars value)
  36. `(define ,(parse var) ,(parse (list 'lambda vars value)))))
  37. (pattern-rule
  38. `(,(? 'var is-not-reserved?) . ,(? 'vars))
  39. (lambda (var vars)
  40. `(applic ,(parse var) ,(map parse vars))))
  41. (pattern-rule
  42. `(begin . ,(? 'exprssions list?))
  43. (lambda (exprssions)
  44. (if (not (pair? exprssions)) `(const ,*void-object*)
  45. `(seq ,(map parse exprssions)))))
  46. (pattern-rule
  47. `(let ,(? 'var list?) . ,(? 'expr))
  48. (lambda (var expr)
  49. (if (is-duplicate? (map car var)) (error 'Input "There is one or more variables with the same name")
  50. (parse `((lambda ,(map car var) (,(beginify expr))) ,@(map cadr var))))))
  51. (pattern-rule
  52. `(let* () ,(? 'expr) . ,(? 'exprs list?))
  53. (lambda (expr exprs)
  54. (parse (beginify (cons expr exprs)))))
  55. (pattern-rule
  56. `(let* ((,(? 'var var?) ,(? 'val)) . ,(? 'rest)) . ,(? 'exprs))
  57. (lambda (var val rest exprs)
  58. (parse `(let ((,var ,val))
  59. (let* ,rest . ,exprs)))))
  60. (pattern-rule
  61. `(letrec . ,(? 'expr))
  62. (lambda (expr)
  63. (parse (expand-letrec `(letrec . ,expr)))))
  64. (pattern-rule
  65. `(and . ,(? 'expr))
  66. (lambda (expr)
  67. (if (null? expr) `(const #t)
  68. (if (null? (cdr expr)) `,(parse (car expr))
  69. (parse `(if ,(car expr) (and ,@(cdr expr)) #f))))))
  70. (pattern-rule
  71. `(cond (else . ,(? 'rule list?)))
  72. (lambda (rule)
  73. (parse `,(beginify rule))))
  74. (pattern-rule
  75. `(cond ,(? 'rule list?) . ,(? 'rules))
  76. (lambda (rule rules)
  77. (if (null? rules) (parse `(if ,(car rule) ,(beginify (cdr rule))))
  78. (parse `(if ,(car rule) ,(beginify (cdr rule)) (cond ,@rules))))))
  79. (pattern-rule
  80. `(quasiquote . ,(? 'expr))
  81. (lambda (expr) `,(expand-qq expr)))
  82. )))
  83. (lambda (e)
  84. (run e
  85. (lambda ()
  86. (error 'parse
  87. (format "I can't recognize this: ~s" e)))))))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement