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