1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
############################################################################
#
# File: polyseq.icn
#
# Subject: Procedure to generate Dietz sequence
#
# Author: Ralph E. Griswold
#
# Date: September 19, 2001
#
############################################################################
#
# This file is in the public domain.
#
############################################################################
#
# The procedure poly2seq(str) generates the Dietz sequence for the
# polynomial str. See Ada Dietz, "Algebraic Expressions in Handweaving".
#
############################################################################
#
# Links: polynom, strings
#
############################################################################
link polynom
link strings
procedure poly2seq(str)
local vars
str := deletec(str, ' ') # delete blanks
vars := &letters ** cset(str)
suspend !map(poly2profile(eval(str)), vars, &digits[2+:*vars])
end
procedure eval(str)
while str ?:= 2(="(", tab(bal(')')), =")", pos(0))
return oper(str) | str2poly(str)
end
procedure oper(str)
return str ? form(tab(bal('-+*^%')), move(1), tab(0))
end
procedure form(str1, op, str2)
return case op of {
"+" : polyadd(eval(str1), eval(str2))
"-" : polysub(eval(str1), eval(str2))
"*" : polymul(eval(str1), eval(str2))
"^" : polyexp(eval(str1), str2)
"%" : polymod(eval(str1), str2)
}
end
|