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.

prekode3a.scm 3.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. ;;;;
  2. ;;;; diverse hjelpekode for innlevering (3a) i INF2810, 2017.
  3. ;;;;
  4. ;;;
  5. ;;; grensesnitt for strømmer på samme måte som i seksjon 3.4 i SICP.
  6. ;;;
  7. (define-syntax
  8. cons-stream
  9. (syntax-rules ()
  10. ((cons-stream head tail) (cons head (delay tail)))))
  11. (define (stream-car stream)
  12. (car stream))
  13. (define (stream-cdr stream)
  14. (force (cdr stream)))
  15. ;;;
  16. ;;; merk at `force' (prosedyre) og `delay' (special form) er innebygd i R5RS.
  17. ;;;
  18. (define the-empty-stream '())
  19. (define (stream-null? stream)
  20. (null? stream))
  21. ;;;
  22. ;;; noen hjelpeprosedyrer til de ulike deloppgave, og diverse listeoperasjoner
  23. ;;; tilpasset strømmer; bruker prikk-notasjon for å la .n. være opsjonalt.
  24. ;;;
  25. (define (show-stream stream . n)
  26. ;;
  27. ;; titt på de .n. første elementene i .stream.
  28. ;;
  29. (define (iter stream i)
  30. (cond ((= i 0) (display "...\n"))
  31. ((stream-null? stream) (newline))
  32. (else (display (stream-car stream))
  33. (display " ")
  34. (iter (stream-cdr stream) (- i 1)))))
  35. (iter stream (if (null? n) 15 (car n))))
  36. (define (stream-filter pred stream)
  37. (cond ((stream-null? stream) the-empty-stream)
  38. ((pred (stream-car stream))
  39. (cons-stream (stream-car stream)
  40. (stream-filter pred
  41. (stream-cdr stream))))
  42. (else (stream-filter pred (stream-cdr stream)))))
  43. (define (stream-ref stream n)
  44. ;;
  45. ;; hent ut (returner) element på posisjon .n. i .s.
  46. ;;
  47. (if (= n 0)
  48. (stream-car stream)
  49. (stream-ref (stream-cdr stream) (- n 1))))
  50. (define (stream-interval low high)
  51. (if (> low high)
  52. the-empty-stream
  53. (cons-stream
  54. low
  55. (stream-interval (+ low 1) high))))
  56. (define (show x)
  57. (display x)
  58. (newline)
  59. x)
  60. (define (add-streams s1 s2)
  61. ;;
  62. ;; elementvis addisjon av to strømmer; forutsetter generalisert `stream-map'
  63. ;; (som polyadisk prosedyre, dvs. med variabelt antall parametre)
  64. ;;
  65. (stream-map + s1 s2))
  66. ;;;
  67. ;;; naturlige tall som en uendelig strøm
  68. ;;;
  69. (define (integers-starting-from n)
  70. (cons-stream n (integers-starting-from (+ n 1))))
  71. (define nats (integers-starting-from 1))
  72. ;;;
  73. ;;;
  74. (define (read-corpus file)
  75. (define (skip port)
  76. ;;
  77. ;; advance .port. to first non-whitespace position (or EOF)
  78. ;;
  79. (let ((c (peek-char port)))
  80. (cond ((and (not (eof-object? c)) (char-whitespace? c))
  81. (read-char port)
  82. (skip port)))))
  83. (define (read-token port)
  84. ;;
  85. ;; read one whitespace-separated token from .port.
  86. ;;
  87. (define (recurse port characters)
  88. (let ((c (peek-char port)))
  89. (if (or (char-whitespace? c) (eof-object? c))
  90. characters
  91. (recurse port (cons (read-char port) characters)))))
  92. (skip port)
  93. (list->string (reverse (recurse port '()))))
  94. (define (read-sentence port)
  95. ;;
  96. ;; read one newline-separated sequence of tokens from .port.
  97. ;;
  98. (define (recurse port tokens)
  99. (let ((c (peek-char port)))
  100. (if (or (eof-object? c) (char=? c #\newline))
  101. (reverse (cons "</s>" tokens))
  102. (let ((token (read-token port)))
  103. (recurse port (cons token tokens))))))
  104. (skip port)
  105. (recurse port (list "<s>")))
  106. (define (recurse port sentences)
  107. ;;
  108. ;; our main driver function, iterate through lines of input from .port.
  109. ;;
  110. (let ((sentence (read-sentence port)))
  111. (if (null? (cddr sentence))
  112. (reverse sentences)
  113. (recurse port (cons sentence sentences)))))
  114. (define (start port)
  115. ;;
  116. ;; initiate iteration over lines of input from .port.
  117. ;;
  118. (recurse port '()))
  119. ;;
  120. ;; connect a port to .file. and have .start. invoked with the .port. as its
  121. ;; sole argument; .port. will be closed upon exit from call-with-input-file.
  122. ;;
  123. (call-with-input-file file start))