Advertisement
Guest User

Untitled

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