|
|
1.1 root 1: (* awk.sml *)
2:
3: signature AWK =
4: sig
5: val makeInt : string -> int (* translates a digit string into an int *)
6: val awk : instream * (string list -> unit) * (unit -> unit) -> unit
7: end
8:
9: structure Awk : AWK =
10: struct
11:
12: val digit0 = ord "0"
13: and digit9 = ord "9"
14: exception MakeInt
15: fun makeInt (s:string) : int =
16: (* translates string s into an integer.
17: Bug: doesn't deal with negative integers *)
18: let val len = length s
19: fun translate(i,n) =
20: if i<len
21: then let val c = ordof(s,i)
22: in if digit0 <= c andalso c <= digit9
23: then translate(i+1,10*n+c-digit0)
24: else raise MakeInt
25: end
26: else n
27: in translate(0,0)
28: end
29:
30: exception END
31:
32: fun parseStream (instream) =
33: fn () => if end_of_stream instream
34: then raise END
35: else Lex2.words(input_line(instream))
36:
37: fun awk(instream,step,final) =
38: let val lines = parseStream instream
39: fun iter () = (step(lines()); iter())
40: in iter() handle END => final()
41: end
42:
43: end
44:
45:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.