University stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

oppgave.scm 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. (load "prekode2b.scm")
  2. ;;;;;;;
  3. ;; 1 ;;
  4. ;;;;;;;
  5. ;; A
  6. (define (make-counter)
  7. (define count 0)
  8. (lambda ()
  9. (set! count (+ count 1))
  10. count))
  11. ;; B
  12. ;; Se 1.b.pdf
  13. ;;;;;;;
  14. ;; 2 ;;
  15. ;;;;;;;
  16. ;; A
  17. (define (make-stack items)
  18. (define (push-item! item)
  19. (set! items (cons item items)))
  20. (define (push! items)
  21. (if (null? items)
  22. '()
  23. (begin (push-item! (car items))
  24. (push! (cdr items)))))
  25. (define (pop!)
  26. (if (null? items)
  27. '()
  28. (let ((item (car items)))
  29. (set! items (cdr items))
  30. item)))
  31. (lambda (symbol . args)
  32. (cond ((eq? symbol 'push!) (push! args))
  33. ((eq? symbol 'pop!) (pop!))
  34. ((eq? symbol 'stack) items)
  35. (else (error "Invalid symbol")))))
  36. ;; B
  37. (define (push! s . args)
  38. (apply s 'push! args))
  39. (define (pop! s)
  40. (s 'pop!))
  41. (define (stack s)
  42. (s 'stack))
  43. ;;;;;;;
  44. ;; 3 ;;
  45. ;;;;;;;
  46. ;; A
  47. ;; Etter define: 3.a-befor.pdf
  48. ;; Etter set-cdr!: 3.a-after.pdf
  49. ;; bar er en sirkulær liste etter kallet på set-cdr!. Cons-celle 4 peker på
  50. ;; cons-celle 2, så (cdr (cdddr bar)) gir celle 2 og (cddr (cdddr bar))
  51. ;; gir celle 3.
  52. ;; B
  53. ;; Etter define: 3.b-before.pdf
  54. ;; Etter den første set-car!: 3.b-after.pdf
  55. ;; Først setter vi car av bar til cdr av bar, så bar er en cons-celle
  56. ;; hvor både car og cdr peker på en liste. ((a towel) a towel) er måten
  57. ;; scheme viser det. Etter den andre set-car! erstatter vi a med 42, og siden
  58. ;; car og cdr peker på samme cons-celle, endrer det på begge. Resultatet blir
  59. ;; dermed ((42 towel) 42 towel).
  60. ;; C
  61. ;; (list? bar) returnerer #f fordi bar er sirkulær.
  62. ;; (list? bah) returnerer #t, fordi den er en gyldig liste, terminert med
  63. ;; en tom liste, hvor det første elementet av listen bare tilfeldigvis er en
  64. ;; annen liste. Predikatet list? bryr seg ikke om at det første elementet
  65. ;; er samme cons-celle som resten av listen.
  66. ;;;;;;;
  67. ;; 4 ;;
  68. ;;;;;;;
  69. ;; A/B
  70. (define (mem symbol proc)
  71. (define (memoize proc)
  72. (define tbl (make-table))
  73. ;; Run the procedure and store the result in the table
  74. (define (run args)
  75. (let ((val (apply proc args)))
  76. (insert! args val tbl)
  77. val))
  78. ;; Run the procedure if the arguments aren't in the table yet,
  79. ;; otherwise just return the table entry
  80. (define (run-memoized args)
  81. (let ((val (lookup args tbl)))
  82. (if (eq? val #f)
  83. (run args)
  84. val)))
  85. ;; If the first argument is _get-proc, return the original procedure.
  86. ;; Otherwise, run the procedure memoized
  87. (define (fn . args)
  88. (if (and (not (null? args)) (eq? (car args) '_get-proc))
  89. proc
  90. (run-memoized args)))
  91. fn)
  92. ;; Calling the procedure with the argument `_get-proc will return the
  93. ;; original procedure.
  94. (define (unmemoize proc)
  95. (proc '_get-proc))
  96. (cond ((eq? symbol 'memoize) (memoize proc))
  97. ((eq? symbol 'unmemoize) (unmemoize proc))
  98. (else (error "Invalid symbol"))))
  99. ;; C
  100. ;; Fib-funksjonen kaller seg selv. Hvis vi lager en ny funksjon
  101. ;; mem-fib, som er memoisert, hvil ikke de rekursive kallene på fib
  102. ;; i fib-prosedyren være memoisert. Den eneste måten å få de rekursive
  103. ;; kallene til å også bli memoisert er å endre variabelen, slik at `fib`
  104. ;; refererer til den memoiserte funksjonen selv når den kalles rekursivt.