Guest User

Untitled

a guest
Feb 20th, 2018
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.33 KB | None | 0 0
  1. ;; named-letの実装復習
  2. ;; let, named-let
  3.  
  4. ;; (let name ((var1 exp1) (var2 exp2) ...) body)
  5. ;; ->
  6. ;; ((lambda (var1 var2 ...)
  7. ;; (define name (lambda (var1 var2 ...) body))
  8. ;; (name var1 var2 ...))
  9. ;; exp1 exp2 ...)
  10. ;; ->
  11. ;; ((lambda (var1 var2 ...)
  12. ;; ((lambda (name) body) (lambda (var1 var2 ...) body))
  13. ;; body)
  14. ;; exp1 exp2 ...)
  15.  
  16.  
  17.  
  18. (define (make-lambda parameters body)
  19. (cons 'lambda (cons parameters body)))
  20.  
  21. (define (named-let? exp)
  22. (symbol? (cadr exp)))
  23. (define (let-bindings exp)
  24. (if (named-let? exp)
  25. (caddr exp)
  26. (cadr exp)))
  27. (define (let-name exp)
  28. (cadr exp))
  29. (define (let-body exp)
  30. (if (named-let? exp)
  31. (cdddr exp)
  32. (cddr exp)))
  33. (define (let-vars exp)
  34. (if (null? exp)
  35. '()
  36. (map car (let-bindings exp))))
  37.  
  38. (define (let-exps exp env)
  39. (if (null? exp)
  40. '()
  41. (map (lambda (x) (eval (cadr x) env))
  42. (let-bindings exp))))
  43.  
  44. ;; let式からlambda式への変換
  45. (define (let->combination exp env)
  46. (if (named-let? exp)
  47. (cons (make-lambda (let-vars exp)
  48. (list
  49. (list 'define (let-name exp)
  50. (make-lambda (let-vars exp)
  51. #?=(let-body exp)))
  52. (cons (let-name exp) (let-vars exp))))
  53. (let-exps exp env))
  54. (cons (make-lambda (let-vars exp)
  55. (let-body exp))
  56. (let-exps exp env))))
Add Comment
Please, Sign In to add comment