parent
c8ed9462d8
commit
1db90b20a8
@ -0,0 +1,47 @@ |
||||
let |
||||
type Vector ~ array 3 of Integer; |
||||
type Matrix ~ array 3 of Vector; |
||||
|
||||
proc putvector (v: Vector) ~ |
||||
let var i: Integer |
||||
in |
||||
begin |
||||
put ('['); putint (v[0]); |
||||
i := 1; |
||||
while i < 3 do |
||||
begin |
||||
put (' '); putint (v[i]); |
||||
i := i+1 |
||||
end; |
||||
put (']') |
||||
end; |
||||
|
||||
proc putmatrix (m: Matrix) ~ |
||||
let var i: Integer |
||||
in |
||||
begin |
||||
i := 0; |
||||
while i < 3 do |
||||
begin |
||||
putvector (m[i]); |
||||
puteol (); |
||||
i := i+1 |
||||
end |
||||
end; |
||||
|
||||
func diagonal |
||||
(m: Matrix): Vector ~ |
||||
[m[0][0], m[1][1], m[2][2]]; |
||||
|
||||
var me: Matrix |
||||
|
||||
in |
||||
begin |
||||
me := [[1,2,3], [4,5,6], [7,8,9]]; |
||||
putmatrix (me); puteol (); |
||||
putvector (diagonal (me)); |
||||
puteol (); puteol (); |
||||
me[1] := [10,11,12]; |
||||
me[1][1] := 22; |
||||
putmatrix (me); puteol () |
||||
end |
@ -0,0 +1,86 @@ |
||||
let |
||||
const max ~ 9999; |
||||
const invalid ~ 0-1; |
||||
type Money ~ Integer; ! 0 .. max |
||||
type Trans ~ Char; ! 'd' | 'w' | 'q' |
||||
|
||||
func sum (m: Money, n: Money): Money ~ |
||||
let const s ~ m + n |
||||
in |
||||
if s <= max then s else invalid; |
||||
|
||||
func diff (m: Money, n: Money): Money ~ |
||||
let const d ~ m - n |
||||
in |
||||
if 0 <= d then d else invalid; |
||||
|
||||
proc gettrans (var code: Trans, |
||||
var amount: Money) ~ |
||||
begin |
||||
get(var code); |
||||
if code = 'q' then |
||||
! skip |
||||
else |
||||
begin |
||||
getint(var amount); |
||||
if (0 > amount) \/ (amount > max) then |
||||
begin |
||||
amount := invalid; code := '?' |
||||
end |
||||
else if (code \= 'd') /\ (code \= 'w') then |
||||
code := '?' |
||||
else |
||||
! ok |
||||
end; |
||||
geteol() |
||||
end; |
||||
|
||||
proc processtrans (code: Trans, |
||||
amount: Money, |
||||
var balance: Money) ~ |
||||
let |
||||
var newbalance: Money |
||||
in |
||||
begin |
||||
if code = 'd' then |
||||
begin |
||||
put('D'); put('e'); put('p'); put('o'); put('s'); |
||||
put('i'); put('t'); put(' '); |
||||
putint(amount); puteol(); |
||||
newbalance := sum(balance, amount) |
||||
end |
||||
else if code = 'w' then |
||||
begin |
||||
put('W'); put('i'); put('t'); put('h'); put('d'); |
||||
put('r'); put('a'); put('w'); put(' '); |
||||
putint(amount); puteol(); |
||||
newbalance := diff(balance, amount) |
||||
end |
||||
else |
||||
; !skip |
||||
if (code = '?') \/ (newbalance = invalid) then |
||||
begin |
||||
put('I'); put('n'); put('v'); put('a'); put('l'); |
||||
put('i'); put('d'); puteol() |
||||
end |
||||
else |
||||
balance := newbalance; |
||||
put('B'); put('a'); put('l'); put('a'); put('n'); |
||||
put('c'); put('e'); put(' '); |
||||
putint(balance); puteol(); |
||||
end; |
||||
|
||||
var balance: Money; |
||||
var amount: Money; |
||||
var trans: Trans |
||||
|
||||
in |
||||
begin |
||||
balance := 0; |
||||
gettrans(var trans, var amount); |
||||
while trans \= 'q' do |
||||
begin |
||||
processtrans(trans, amount, var balance); |
||||
gettrans(var trans, var amount) |
||||
end |
||||
end |
@ -0,0 +1,26 @@ |
||||
! Plot a histogram from a stream of nonzero integers. |
||||
|
||||
let |
||||
const mark ~ '+'; |
||||
var n : Integer |
||||
in |
||||
begin |
||||
getint (var n); geteol (); |
||||
while n \= 0 do |
||||
let |
||||
var i : Integer; |
||||
var gap : Integer |
||||
in |
||||
begin |
||||
gap := if n > 0 then 20 else 20 + n; |
||||
if n < 0 then n := 0 - n else ; |
||||
i := 0; |
||||
while i < gap do |
||||
begin put (' '); i := i + 1 end; |
||||
i := 0; |
||||
while i < n do |
||||
begin put (mark); i := i + 1 end; |
||||
puteol (); |
||||
getint (var n); geteol () |
||||
end |
||||
end |
@ -0,0 +1,16 @@ |
||||
let proc p1 () ~ |
||||
let var c1: Char; |
||||
proc p2 () ~ |
||||
let proc p3 () ~ |
||||
let proc p4 () ~ |
||||
let proc p5 () ~ |
||||
let proc p6 () ~ |
||||
let proc p7 () ~ |
||||
put (c1) |
||||
in p7 () |
||||
in p6 () |
||||
in p5 () |
||||
in p4 () |
||||
in p3 () |
||||
in begin c1 := '+'; p2 () end |
||||
in p1 () |
@ -0,0 +1,117 @@ |
||||
let |
||||
type Name ~ array 6 of Char; |
||||
type Number ~ Integer; |
||||
|
||||
proc prompt () ~ |
||||
begin |
||||
put('N'); put('a'); put('m'); put('e'); |
||||
put('?'); put(' ') |
||||
end; |
||||
|
||||
proc getname (var newname: Name) ~ |
||||
let var i: Integer |
||||
in |
||||
begin |
||||
i := 0; |
||||
while i < 6 do |
||||
begin |
||||
if eol () then |
||||
newname[i] := ' ' |
||||
else |
||||
get (var newname[i]); |
||||
i := i+1 |
||||
end |
||||
end; |
||||
|
||||
proc putname (newname: Name) ~ |
||||
let var i: Integer |
||||
in |
||||
begin |
||||
i := 0; |
||||
while i < 6 do |
||||
begin |
||||
put (newname[i]); |
||||
i := i+1 |
||||
end |
||||
end; |
||||
|
||||
type Entry ~ record |
||||
number: Number, |
||||
name: Name |
||||
end; |
||||
type Directory ~ record |
||||
size: Integer, |
||||
entry: array 100 of Entry |
||||
end; |
||||
|
||||
proc initialize (var dir: Directory) ~ |
||||
dir.size := 0; |
||||
|
||||
proc add (var dir: Directory, |
||||
newname: Name, |
||||
newnumber: Number) ~ |
||||
begin |
||||
dir.entry[dir.size] := |
||||
{number ~ newnumber, name ~ newname}; |
||||
dir.size := dir.size + 1 |
||||
end; |
||||
|
||||
proc lookup (var dir: Directory, |
||||
oldname: Name, |
||||
var oldnumber: Number, |
||||
var found: Boolean) ~ |
||||
let |
||||
var i: Integer; |
||||
var searching: Boolean |
||||
in |
||||
begin |
||||
i := 0; searching := true; |
||||
while (i < dir.size) /\ searching do |
||||
if dir.entry[i].name = oldname then |
||||
searching := false |
||||
else |
||||
i := i+1; |
||||
found := \searching; |
||||
if found then |
||||
oldnumber := dir.entry[i].number |
||||
else !skip |
||||
end; |
||||
|
||||
var mydir: Directory |
||||
|
||||
in |
||||
|
||||
begin |
||||
initialize (var mydir); |
||||
add (var mydir, |
||||
['D','a','v','i','d',' '], 6041); |
||||
add (var mydir, |
||||
['M','u','f','f','y',' '], 4969); |
||||
add (var mydir, |
||||
['K','i','e','r','a','n'], 6042); |
||||
add (var mydir, |
||||
['A','l','e','x','a',' '], 5322); |
||||
|
||||
let |
||||
const blank ~ [' ', ' ', ' ', ' ', ' ', ' ']; |
||||
var name: Name; |
||||
var num: Number; |
||||
var ok: Boolean |
||||
in |
||||
begin |
||||
prompt (); |
||||
getname (var name); geteol (); |
||||
while name \= blank do |
||||
begin |
||||
putname (name); put (' '); |
||||
lookup (var mydir, name, var num, var ok); |
||||
if ok then |
||||
putint (num) |
||||
else |
||||
put ('?'); |
||||
puteol (); |
||||
prompt (); |
||||
getname (var name); geteol () |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,30 @@ |
||||
! Program with a variety of contextual errors. |
||||
|
||||
let |
||||
type String ~ array 4 of Char; |
||||
type Name ~ array 3 of String; |
||||
type Rec ~ record x: Integer, x: Integer end; |
||||
|
||||
var me: Name; |
||||
var silly : maxint; |
||||
var silly: Rec; |
||||
|
||||
proc putstr (s: String) ~ |
||||
let var i: Integer |
||||
in |
||||
begin |
||||
s[4] := ' '; |
||||
i := 0; |
||||
while i do |
||||
begin i := i+true; |
||||
put (s[\i]) |
||||
end |
||||
end |
||||
|
||||
in |
||||
begin |
||||
me[true] := ['T','i','n','y']; |
||||
me[2][2] := 0; |
||||
put (me[1]); put (4); put (); |
||||
putstr (initials (me)); puteol () |
||||
end |
@ -0,0 +1,148 @@ |
||||
! Marry a woman and man. |
||||
! Input following data for each person (woman then man): |
||||
! surname, forename (each up to 10 non-blank chars), |
||||
! sex ('M'|'F'), marital status ('m'|'u'), |
||||
! day, month, year of birth. |
||||
|
||||
let |
||||
type Month ~ Integer; |
||||
const Jan ~ 1; const Feb ~ 2; const Mar ~ 3; |
||||
const Apr ~ 4; const May ~ 5; const Jun ~ 6; |
||||
const Jul ~ 7; const Aug ~ 8; const Sep ~ 9; |
||||
const Oct ~ 10; const Nov ~ 11; const Dec ~ 12; |
||||
|
||||
type Date ~ record |
||||
y : Integer, |
||||
m : Month, |
||||
d : Integer |
||||
end; |
||||
const today ~ {y ~ 1993, m ~ Apr, d ~ 1}; |
||||
|
||||
proc getdate (var date : Date) ~ |
||||
begin |
||||
getint (var date.d); getint (var date.m); getint (var date.y) |
||||
end; |
||||
|
||||
proc putdate (date : Date) ~ |
||||
begin |
||||
putint (date.d); put ('/'); |
||||
putint (date.m); put ('/'); |
||||
putint (date.y // 100) |
||||
end; |
||||
|
||||
func yearsbefore (yrs : Integer, date : Date) : Date ~ |
||||
{y ~ date.y - yrs, m ~ date.m, d ~ date.d}; |
||||
|
||||
func earlier (date1 : Date, date2 : Date) : Boolean ~ |
||||
if date1.y < date2.y then true |
||||
else if date1.y > date2.y then false |
||||
else if date1.m < date2.m then true |
||||
else if date1.m > date2.m then false |
||||
else date1.d < date2.d; |
||||
|
||||
const maxname ~ 10; |
||||
type Name ~ array 10 of Char; |
||||
|
||||
proc getname (var name : Name) ~ |
||||
let |
||||
var ch : Char; |
||||
var length : Integer |
||||
in |
||||
begin |
||||
get (var ch); while ch = ' ' do get (var ch); |
||||
length := 0; |
||||
while length < maxname do |
||||
begin |
||||
length := length + 1; name[length] := ch; |
||||
if ch \= ' ' then get (var ch) else ! skip |
||||
end |
||||
end; |
||||
|
||||
proc putname (name : Name) ~ |
||||
let |
||||
var pad : Boolean; |
||||
var length : Integer |
||||
in |
||||
begin |
||||
pad := false; length := 0; |
||||
while (\ pad) /\ (length < maxname) do |
||||
begin |
||||
length := length + 1; |
||||
if name[length] = ' ' then |
||||
pad := true |
||||
else |
||||
put (name[length]) |
||||
end |
||||
end; |
||||
|
||||
type Person ~ record |
||||
surname : Name, |
||||
forename : Name, |
||||
male : Boolean, |
||||
married : Boolean, |
||||
dob : Date |
||||
end; |
||||
|
||||
proc getperson (var person : Person) ~ |
||||
let |
||||
var fore : Name; |
||||
var sur : Name; |
||||
var s : Char; |
||||
var m : Char; |
||||
var birth : Date |
||||
in |
||||
begin |
||||
getname (var sur); getname (var fore); |
||||
get (var s); while s = ' ' do get (var s); |
||||
get (var m); while m = ' ' do get (var m); |
||||
getdate (var birth); |
||||
person := {surname ~ sur, forename ~ fore, |
||||
male ~ (s = 'M'), married ~ (m = 'm'), |
||||
dob ~ birth} |
||||
end; |
||||
|
||||
proc putperson (person : Person) ~ |
||||
begin |
||||
putname (person.surname); put (' '); |
||||
putname (person.forename); put (' '); |
||||
put (if person.male then 'M' else 'F'); put (' '); |
||||
put (if person.married then 'm' else 'u'); put (' '); |
||||
putdate (person.dob) |
||||
end; |
||||
|
||||
func age (person : Person) : Integer ~ |
||||
let |
||||
const dob ~ person.dob |
||||
in |
||||
if (today.m > dob.m) \/ |
||||
((today.m = dob.m) /\ (today.d >= dob.d)) |
||||
then today.y - dob.y |
||||
else today.y - dob.y - 1; |
||||
|
||||
const latestdob ~ yearsbefore (16, today); |
||||
|
||||
var bride : Person; |
||||
var groom : Person |
||||
|
||||
in |
||||
begin |
||||
getperson (var bride); |
||||
getperson (var groom); |
||||
puteol (); |
||||
if \ bride.male /\ groom.male /\ |
||||
\ (bride.married \/ groom.married) /\ |
||||
\ earlier (latestdob, bride.dob) /\ |
||||
\ earlier (latestdob, groom.dob) then |
||||
begin |
||||
put ('O'); put ('K'); puteol (); |
||||
bride.married := true; groom.married := true; |
||||
bride.surname := groom.surname |
||||
end |
||||
else |
||||
begin |
||||
put ('N'); put ('o'); put ('!'); puteol () |
||||
end; |
||||
putperson (bride); put (' '); putint (age (bride)); puteol (); |
||||
putperson (groom); put (' '); putint (age (groom)); puteol (); |
||||
putdate (today); puteol () |
||||
end |
@ -0,0 +1,15 @@ |
||||
let |
||||
func factorial (n: Integer): Integer ~ |
||||
if n <= 1 |
||||
then 1 |
||||
else n * factorial (n-1); |
||||
|
||||
var i: Integer |
||||
|
||||
in |
||||
begin |
||||
getint (var i); |
||||
putint (i); put ('!'); |
||||
put (' '); put ('='); put (' '); |
||||
putint (factorial (i)) |
||||
end |
@ -0,0 +1,28 @@ |
||||
! Print powers of integers. |
||||
|
||||
let |
||||
func even (n : Integer) : Boolean ~ |
||||
(n // 2) = 0; |
||||
|
||||
func sqr (n : Integer) : Integer ~ |
||||
n * n; |
||||
|
||||
func power (b : Integer, n : Integer) : Integer ~ |
||||
! assume n >= 0 |
||||
if n = 0 |
||||
then 1 |
||||
else |
||||
if even (n) |
||||
then sqr (power (b, n/2)) |
||||
else sqr (power (b, n/2)) * b; |
||||
|
||||
var x : Integer; |
||||
var m : Integer |
||||
in |
||||
begin |
||||
getint (var x); getint (var m); |
||||
putint (x); put ('^'); putint (m); |
||||
put (' '); put ('='); put (' '); |
||||
putint (power (x, m)); |
||||
puteol () |
||||
end |
@ -0,0 +1,3 @@ |
||||
begin |
||||
put('H'); put('i'); put('!') |
||||
end |
@ -0,0 +1,53 @@ |
||||
let |
||||
const maxlength ~ 15; |
||||
type String ~ array 16 of Char; |
||||
const null ~ chr(0); |
||||
!Strings will be padded with nulls. |
||||
|
||||
proc getstring (var s: String) ~ |
||||
let var l: Integer |
||||
in |
||||
begin |
||||
l := 0; |
||||
while l < maxlength do |
||||
begin |
||||
if eol () then |
||||
s[l] := null |
||||
else |
||||
get (var s[l]); |
||||
l := l+1; |
||||
end; |
||||
s[maxlength] := null |
||||
end; |
||||
|
||||
proc putstring (s: String) ~ |
||||
let var i: Integer |
||||
in |
||||
begin |
||||
i := 0; |
||||
while s[i] \= null do |
||||
begin |
||||
put (s[i]); |
||||
i := i+1 |
||||
end |
||||
end; |
||||
|
||||
var you: String |
||||
|
||||
in |
||||
begin |
||||
putstring ( |
||||
['W','h','o',' ', |
||||
'a','r','e',' ', |
||||
'y','o','u','?', |
||||
null,null,null,null]); |
||||
puteol (); |
||||
getstring (var you); geteol (); |
||||
putstring ( |
||||
['H','u','l','l', |
||||
'o',',',' ',null, |
||||
null,null,null,null, |
||||
null,null,null,null]); |
||||
putstring (you); put ('!'); |
||||
puteol () |
||||
end |
@ -0,0 +1,52 @@ |
||||
let |
||||
type Name ~ array 6 of Char; |
||||
type Number ~ Integer; |
||||
|
||||
proc getname (var newname: Name) ~ |
||||
let var i: Integer |
||||
in |
||||
begin |
||||
i := 0; |
||||
while i < 6 do |
||||
begin |
||||
if eol () then |
||||
newname[i] := ' ' |
||||
else |
||||
get (var newname[i]); |
||||
i := i+1 |
||||
end |
||||
end; |
||||
|
||||
proc putname (newname: Name) ~ |
||||
let var i: Integer |
||||
in |
||||
begin |
||||
i := 0; |
||||
while i < 6 do |
||||
begin |
||||
put (newname[i]); |
||||
i := i+1 |
||||
end |
||||
end; |
||||
|
||||
func samename (name1: Name, name2: Name) : Boolean ~ |
||||
let |
||||
func same (n: Integer) : Boolean ~ |
||||
(name1[n] = name2[n]) /\ |
||||
(if n = 0 then true else same (n-1)) |
||||
in |
||||
same (5); |
||||
|
||||
var nam: Name |
||||
|
||||
in |
||||
|
||||
begin |
||||
getname (var nam); geteol (); |
||||
putname (nam); put (' '); |
||||
if samename (nam, ['D','a','v','i','d',' ']) then |
||||
put ('Y') |
||||
else |
||||
put ('N'); |
||||
puteol () |
||||
end |
@ -0,0 +1,31 @@ |
||||
let |
||||
var g: Integer; |
||||
|
||||
proc P() ~ |
||||
let |
||||
var p: Integer; |
||||
|
||||
proc Q() ~ |
||||
let |
||||
var q: Integer; |
||||
proc R() ~ |
||||
let |
||||
var r: Integer |
||||
in |
||||
r := (g+p+q) * 1000 ! should cause overflow |
||||
in |
||||
begin q := g+p; R() end; |
||||
|
||||
proc S() ~ |
||||
let |
||||
var s: Integer |
||||
in |
||||
begin s := g+p+1; Q() end |
||||
|
||||
in |
||||
begin p := g+1; S() end |
||||
|
||||
in |
||||
begin g := 1000; P() end |
||||
|
||||
|
@ -0,0 +1,56 @@ |
||||
! test program proc.Æ |
||||
let |
||||
const size ~ 6; |
||||
type String ~ array 6 of Char; |
||||
|
||||
proc putstr (s: String) ~ |
||||
let var i: Integer |
||||
in |
||||
begin |
||||
i := 0; |
||||
while i < size do |
||||
begin put (s[i]); i := i+1 end |
||||
end; |
||||
|
||||
proc apply (proc p (var c : Char), var s : String) ~ |
||||
let |
||||
var i : Integer |
||||
in |
||||
begin |
||||
i := 0; |
||||
while i < size do |
||||
begin |
||||
p (var s[i]); |
||||
i := i+1 |
||||
end |
||||
end; !apply |
||||
|
||||
proc shift (var l : Char) ~ |
||||
let const ordl ~ ord (l) |
||||
in |
||||
if (ord('a') <= ordl) |
||||
/\ (ordl <= ord('z')) then |
||||
l := chr (ordl - ord('a') + ord('A')) |
||||
else |
||||
; !skip |
||||
|
||||
proc replaceall (old: Char, new: Char, |
||||
var s: String) ~ |
||||
let |
||||
proc zap (var c: Char) ~ |
||||
if c = old then c := new else !skip |
||||
in |
||||
apply (proc zap, var s); |
||||
|
||||
var name : String |
||||
|
||||
in |
||||
begin |
||||
apply (proc get, var name); |
||||
geteol (); |
||||
putstr (name); puteol (); |
||||
apply (proc shift, var name); |
||||
putstr (name); puteol (); |
||||
replaceall ('I', 'i', var name); |
||||
putstr (name); puteol () |
||||
end |
@ -0,0 +1,31 @@ |
||||
! Plot a histogram from a stream of nonzero integers. |
||||
|
||||
let |
||||
const mid ~ 40; |
||||
var n : Integer; |
||||
|
||||
proc putmany (c : Char, n : Integer) ~ |
||||
let |
||||
var i : Integer |
||||
in |
||||
begin |
||||
i := 0; |
||||
while i < n do |
||||
begin put (c); i := i + 1 end |
||||
end; |
||||
|
||||
proc makenonnegative (var n : Integer) ~ |
||||
if n < 0 then n := 0 - n else |
||||
|
||||
in |
||||
begin |
||||
getint (var n); geteol (); |
||||
while n \= 0 do |
||||
begin |
||||
putmany (' ', if n > 0 then mid else mid + n); |
||||
makenonnegative (var n); |
||||
putmany ('+', n); |
||||
puteol (); |
||||
getint (var n); geteol () |
||||
end |
||||
end |
@ -0,0 +1,24 @@ |
||||
! test program record.Æ |
||||
let |
||||
type Month ~ array 3 of Char; |
||||
type Date ~ record d: Integer, m: Month end; |
||||
const xmas ~ {d ~ 25, |
||||
m ~ ['D','e','c']}; |
||||
var eve: Date; |
||||
|
||||
proc putmonth (mth: Month) ~ |
||||
begin |
||||
put (mth[0]); put (mth[1]); put (mth[2]) |
||||
end; |
||||
|
||||
proc putdate (date: Date) ~ |
||||
begin |
||||
putint (date.d); put ('/'); putmonth (date.m) |
||||
end |
||||
|
||||
in |
||||
begin |
||||
putdate (xmas); puteol (); |
||||
eve := {d ~ xmas.d-1, m ~ xmas.m}; |
||||
putdate (eve); puteol () |
||||
end |
@ -0,0 +1,13 @@ |
||||
let |
||||
type Str ~ array 10 of Char; |
||||
|
||||
func replicate (c: Char): Str ~ |
||||
[c,c,c,c,c,c,c,c,c,c]; |
||||
|
||||
var s: Str |
||||
in |
||||
|
||||
begin |
||||
s := replicate('*'); |
||||
put (s[0]); put(s[9]); puteol() |
||||
end |
@ -0,0 +1,32 @@ |
||||
let |
||||
|
||||
proc putmany (n: Integer, c: Char) ~ |
||||
let |
||||
var i: Integer |
||||
in |
||||
begin |
||||
i := 0; |
||||
while i < n do |
||||
begin i := i+1; put (c) end |
||||
end; |
||||
|
||||
var n: Integer; var r: Integer; |
||||
const mark ~ '@' |
||||
|
||||
in |
||||
begin |
||||
getint (var n); geteol (); |
||||
r := 0; |
||||
while r < (n-1) do |
||||
begin |
||||
r := r + 1; |
||||
putmany (n-r, ' '); put (mark); |
||||
if r >= 2 then |
||||
begin |
||||
putmany (2*r - 3, ' '); put (mark) |
||||
end |
||||
else; !skip |
||||
puteol () |
||||
end; |
||||
putmany (2*n - 1, mark) |
||||
end |
Reference in new issue