Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2018
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.66 KB | None | 0 0
  1. #lang racket
  2. ;; pomocnicza funkcja dla list tagowanych o określonej długości
  3.  
  4. (define (tagged-tuple? tag len p)
  5. (and (list? p)
  6. (= (length p) len)
  7. (eq? (car p) tag)))
  8.  
  9. (define (tagged-list? tag p)
  10. (and (pair? p)
  11. (eq? (car p) tag)
  12. (list? (cdr p))))
  13.  
  14. ;; self-evaluating expressions
  15.  
  16. (define (const? t)
  17. (or (number? t)
  18. (my-symbol? t)
  19. (eq? t 'true)
  20. (eq? t 'false)))
  21.  
  22. ;; arithmetic expressions
  23.  
  24. (define (op? t)
  25. (and (list? t)
  26. (member (car t) '(+ - * / = > >= < <= eq?))))
  27.  
  28. (define (op-op e)
  29. (car e))
  30.  
  31. (define (op-args e)
  32. (cdr e))
  33.  
  34. (define (op-cons op args)
  35. (cons op args))
  36.  
  37. (define (op->proc op)
  38. (cond [(eq? op '+) +]
  39. [(eq? op '*) *]
  40. [(eq? op '-) -]
  41. [(eq? op '/) /]
  42. [(eq? op '=) (compose bool->val =)]
  43. [(eq? op '>) (compose bool->val >)]
  44. [(eq? op '>=) (compose bool->val >=)]
  45. [(eq? op '<) (compose bool->val <)]
  46. [(eq? op '<=) (compose bool->val <=)]
  47. [(eq? op 'eq?) (lambda (x y)
  48. (bool->val (eq? (symbol-symbol x)
  49. (symbol-symbol y))))]))
  50.  
  51. ;; symbols
  52.  
  53. (define (my-symbol? e)
  54. (and (tagged-tuple? 'quote 2 e)
  55. (symbol? (second e))))
  56.  
  57. (define (symbol-symbol e)
  58. (second e))
  59.  
  60. (define (symbol-cons s)
  61. (list 'quote s))
  62.  
  63. ;;operators
  64. (define (constant? t)
  65. (tagged-tuple? 'const 2 t))
  66.  
  67. (define (get-const-value t)
  68. (second t))
  69. (define (operator-cons op l r)
  70. (list op l r))
  71.  
  72. (define (operator? t)
  73. (and
  74. (list? t)
  75. (= (length t) 3)
  76. (my-symbol? (car t))
  77. (or
  78. (eq? (get-operator t) '+)
  79. (eq? (get-operator t) '-)
  80. (eq? (get-operator t) '*)
  81. (eq? (get-operator t) '/))))
  82.  
  83. (define (get-operator t)
  84. (symbol-symbol (first t)))
  85. (define (get-left-op-expr t)
  86. (second t))
  87. (define (get-right-op-expr t)
  88. (third t))
  89.  
  90.  
  91. ;; lets
  92.  
  93. (define (let-def? t)
  94. (and (list? t)
  95. (= (length t) 2)
  96. (symbol? (car t))))
  97.  
  98. (define (let-def-var e)
  99. (car e))
  100.  
  101. (define (let-def-expr e)
  102. (cadr e))
  103.  
  104. (define (let-def-cons x e)
  105. (list x e))
  106.  
  107. (define (let? t)
  108. (and (tagged-tuple? 'let 3 t)
  109. (let-def? (cadr t))))
  110.  
  111. (define (let-def e)
  112. (cadr e))
  113.  
  114. (define (let-expr e)
  115. (caddr e))
  116.  
  117. (define (let-cons def e)
  118. (list 'let def e))
  119.  
  120. ;; variables
  121.  
  122. (define (var? t)
  123. (symbol? t))
  124.  
  125. (define (var-var e)
  126. e)
  127.  
  128. (define (var-cons x)
  129. x)
  130.  
  131. ;; pairs
  132.  
  133. (define (cons? t)
  134. (tagged-tuple? 'cons 3 t))
  135.  
  136. (define (cons-fst e)
  137. (second e))
  138.  
  139. (define (cons-snd e)
  140. (third e))
  141.  
  142. (define (cons-cons e1 e2)
  143. (list 'cons e1 e2))
  144.  
  145. (define (car? t)
  146. (tagged-tuple? 'car 2 t))
  147.  
  148. (define (car-expr e)
  149. (second e))
  150.  
  151. (define (cdr? t)
  152. (tagged-tuple? 'cdr 2 t))
  153.  
  154. (define (cdr-expr e)
  155. (second e))
  156.  
  157. (define (pair?? t)
  158. (tagged-tuple? 'pair? 2 t))
  159.  
  160. (define (pair?-expr e)
  161. (second e))
  162.  
  163. (define (pair?-cons e)
  164. (list 'pair? e))
  165.  
  166.  
  167. ;; if
  168.  
  169. (define (if? t)
  170. (tagged-tuple? 'if 4 t))
  171.  
  172. (define (if-cons b t f)
  173. (list 'if b t f))
  174.  
  175. (define (if-cond e)
  176. (second e))
  177.  
  178. (define (if-then e)
  179. (third e))
  180.  
  181. (define (if-else e)
  182. (fourth e))
  183.  
  184. ;; cond
  185.  
  186. (define (cond-clause? t)
  187. (and (list? t)
  188. (= (length t) 2)))
  189.  
  190. (define (cond-clause-cond c)
  191. (first c))
  192.  
  193. (define (cond-clause-expr c)
  194. (second c))
  195.  
  196. (define (cond-claue-cons b e)
  197. (list b e))
  198.  
  199. (define (cond? t)
  200. (and (tagged-list? 'cond t)
  201. (andmap cond-clause? (cdr t))))
  202.  
  203. (define (cond-clauses e)
  204. (cdr e))
  205.  
  206. (define (cond-cons cs)
  207. (cons 'cond cs))
  208.  
  209. ;; lists
  210.  
  211. (define (my-null? t)
  212. (eq? t 'null))
  213.  
  214. (define (null?? t)
  215. (tagged-tuple? 'null? 2 t))
  216.  
  217. (define (null?-expr e)
  218. (second e))
  219.  
  220. (define (null?-cons e)
  221. (list 'null? e))
  222.  
  223.  
  224. ;; lambdas
  225.  
  226. (define (lambda? t)
  227. (and (tagged-tuple? 'lambda 3 t)
  228. (list? (cadr t))
  229. (andmap symbol? (cadr t))))
  230.  
  231. (define (lambda-cons vars e)
  232. (list 'lambda vars e))
  233.  
  234. (define (lambda-vars e)
  235. (cadr e))
  236.  
  237. (define (lambda-expr e)
  238. (caddr e))
  239.  
  240. ;; lambda-rec
  241.  
  242. (define (lambda-rec? t)
  243. (and (tagged-tuple? 'lambda-rec 3 t)
  244. (list? (cadr t))
  245. (>= (length (cadr t)) 1)
  246. (andmap symbol? (cadr t))))
  247.  
  248. (define (lambda-rec-cons vars e)
  249. (list 'lambda-rec vars e))
  250.  
  251. (define (lambda-rec-expr e)
  252. (third e))
  253.  
  254. (define (lambda-rec-name e)
  255. (car (second e)))
  256.  
  257. (define (lambda-rec-vars e)
  258. (cdr (second e)))
  259.  
  260. ;; applications
  261.  
  262. (define (app? t)
  263. (and (list? t)
  264. (> (length t) 0)))
  265.  
  266. (define (app-cons proc args)
  267. (cons proc args))
  268.  
  269. (define (app-proc e)
  270. (car e))
  271.  
  272. (define (app-args e)
  273. (cdr e))
  274.  
  275.  
  276. ;; expressions
  277.  
  278. (define (expr? t)
  279. (or (const? t)
  280. (and (op? t)
  281. (andmap expr? (op-args t)))
  282. (and (let? t)
  283. (expr? (let-expr t))
  284. (expr? (let-def-expr (let-def t))))
  285. (and (cons? t)
  286. (expr? (cons-fst t))
  287. (expr? (cons-snd t)))
  288. (and (car? t)
  289. (expr? (car-expr t)))
  290. (and (cdr? t)
  291. (expr? (cdr-expr t)))
  292. (and (pair?? t)
  293. (expr? (pair?-expr t)))
  294. (my-null? t)
  295. (and (null?? t)
  296. (expr? (null?-expr t)))
  297. (and (if? t)
  298. (expr? (if-cond t))
  299. (expr? (if-then t))
  300. (expr? (if-else t)))
  301. (and (cond? t)
  302. (andmap (lambda (c)
  303. (and (expr? (cond-clause-cond c))
  304. (expr? (cond-clause-expr c))))
  305. (cond-clauses t)))
  306. (and (lambda? t)
  307. (expr? (lambda-expr t)))
  308. (and (lambda-rec? t)
  309. (expr? (lambda-rec-expr t)))
  310. (var? t)
  311. (and (app? t)
  312. (expr? (app-proc t))
  313. (andmap expr? (app-args t)))))
  314.  
  315. ;; environments
  316.  
  317. (define empty-env
  318. null)
  319.  
  320. (define (add-to-env x v env)
  321. (cons (list x v) env))
  322.  
  323. (define (find-in-env x env)
  324. (cond [(null? env) (error "undefined variable" x)]
  325. [(eq? x (caar env)) (cadar env)]
  326. [else (find-in-env x (cdr env))]))
  327.  
  328. ;; closures
  329.  
  330. (define (closure-cons xs expr env)
  331. (list 'closure xs expr env))
  332.  
  333. (define (closure? c)
  334. (and (list? c)
  335. (= (length c) 4)
  336. (eq? (car c) 'closure)))
  337.  
  338. (define (closure-vars c)
  339. (cadr c))
  340.  
  341. (define (closure-expr c)
  342. (caddr c))
  343.  
  344. (define (closure-env c)
  345. (cadddr c))
  346.  
  347. ;; closure-rec
  348.  
  349. (define (closure-rec? t)
  350. (tagged-tuple? 'closure-rec 5 t))
  351.  
  352. (define (closure-rec-name e)
  353. (second e))
  354.  
  355. (define (closure-rec-vars e)
  356. (third e))
  357.  
  358. (define (closure-rec-expr e)
  359. (fourth e))
  360.  
  361. (define (closure-rec-env e)
  362. (fifth e))
  363.  
  364. (define (closure-rec-cons f xs e env)
  365. (list 'closure-rec f xs e env))
  366.  
  367. ;; evaluator
  368.  
  369. (define (bool->val b)
  370. (if b 'true 'false))
  371.  
  372. (define (val->bool s)
  373. (cond [(eq? s 'true) true]
  374. [(eq? s 'false) false]
  375. [else (error "could not convert symbol to bool")]))
  376.  
  377. (define (eval-env e env)
  378. (cond [(const? e)
  379. e]
  380.  
  381. [(operator? e)
  382. ((op->proc (get-operator e)) (eval-env (get-left-op-expr e) env) (eval-env (get-right-op-expr e) env))]
  383. [(op? e)
  384. (apply (op->proc (op-op e))
  385. (map (lambda (a) (eval-env a env))
  386. (op-args e)))]
  387. [(let? e)
  388. (eval-env (let-expr e)
  389. (env-for-let (let-def e) env))]
  390. [(my-null? e)
  391. null]
  392. [(cons? e)
  393. (cons (eval-env (cons-fst e) env)
  394. (eval-env (cons-snd e) env))]
  395. [(car? e)
  396. (car (eval-env (car-expr e) env))]
  397. [(cdr? e)
  398. (cdr (eval-env (cdr-expr e) env))]
  399. [(pair?? e)
  400. (bool->val (pair? (eval-env (pair?-expr e) env)))]
  401. [(null?? e)
  402. (bool->val (null? (eval-env (null?-expr e) env)))]
  403. [(if? e)
  404. (if (val->bool (eval-env (if-cond e) env))
  405. (eval-env (if-then e) env)
  406. (eval-env (if-else e) env))]
  407. [(cond? e)
  408. (eval-cond-clauses (cond-clauses e) env)]
  409. [(var? e)
  410. (find-in-env (var-var e) env)]
  411. [(lambda? e)
  412. (closure-cons (lambda-vars e) (lambda-expr e) env)]
  413. [(lambda-rec? e)
  414. (closure-rec-cons (lambda-rec-name e)
  415. (lambda-rec-vars e)
  416. (lambda-rec-expr e)
  417. env)]
  418. [(app? e)
  419. (apply-closure
  420. (eval-env (app-proc e) env)
  421. (map (lambda (a) (eval-env a env))
  422. (app-args e)))]))
  423.  
  424. (define (eval-cond-clauses cs env)
  425. (if (null? cs)
  426. (error "no true clause in cond")
  427. (let ([cond (cond-clause-cond (car cs))]
  428. [expr (cond-clause-expr (car cs))])
  429. (if (val->bool (eval-env cond env))
  430. (eval-env expr env)
  431. (eval-cond-clauses (cdr cs) env)))))
  432.  
  433. (define (apply-closure c args)
  434. (cond [(closure? c)
  435. (eval-env
  436. (closure-expr c)
  437. (env-for-closure
  438. (closure-vars c)
  439. args
  440. (closure-env c)))]
  441. [(closure-rec? c)
  442. (eval-env
  443. (closure-rec-expr c)
  444. (add-to-env
  445. (closure-rec-name c)
  446. c
  447. (env-for-closure
  448. (closure-rec-vars c)
  449. args
  450. (closure-rec-env c))))]))
  451.  
  452. (define (env-for-closure xs vs env)
  453. (cond [(and (null? xs) (null? vs)) env]
  454. [(and (not (null? xs)) (not (null? vs)))
  455. (add-to-env
  456. (car xs)
  457. (car vs)
  458. (env-for-closure (cdr xs) (cdr vs) env))]
  459. [else (error "arity mismatch")]))
  460.  
  461. (define (env-for-let def env)
  462. (add-to-env
  463. (let-def-var def)
  464. (eval-env (let-def-expr def) env)
  465. env))
  466.  
  467. (define (eval e)
  468. (eval-env e empty-env))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement