June 2018 Update

This commit is contained in:
Ingy döt Net 2018-06-22 20:57:24 +00:00
parent ba8067c3b7
commit 22f33d4004
5278 changed files with 84726 additions and 14379 deletions

View file

@ -0,0 +1,4 @@
IN: scratchpad 3 4 2 * 1 5 - 2 3 ^ ^ / +
--- Data stack:
3+1/8192

View file

@ -0,0 +1,2 @@
{ 3 4 2 * 1 5 - 2 3 ^ ^ / + } [ 1quotation ] map
[ dup pprint bl call datastack . ] each

View file

@ -0,0 +1,39 @@
rmod(i, j) := mod(j, i)$
rpow(x, y) := y^x$
rpn(sexpr) := (
operands: [],
expr: charlist(sexpr),
for token in expr do (
if token = "+" then (
push(pop(operands) + pop(operands), operands)
)
elseif token = "-" then (
push(-1 * (pop(operands) - pop(operands)), operands)
)
elseif token = "*" then (
push(pop(operands) * pop(operands), operands)
)
elseif token = "/" then (
push(1 / (pop(operands) / pop(operands)), operands)
)
elseif token = "%" then (
push(rmod(pop(operands), pop(operands)), operands)
)
elseif token = "^" then (
push(rpow(pop(operands), pop(operands)), operands)
)
elseif token # " " then (
push(parse_string(token), operands)
),
if token # " " then (
print(token, " : ", operands)
)
),
pop(operands)
)$
rpn("3 4 2 * 1 5 - 2 3 ^ ^ / +"), numer;

View file

@ -0,0 +1,15 @@
(%i5) ev(rpn("3 4 2 * 1 5 - 2 3 ^ ^ / +"),numer)
3 : [3]
4 : [4, 3]
2 : [2, 4, 3]
* : [8, 3]
1 : [1, 8, 3]
5 : [5, 1, 8, 3]
- : [- 4, 8, 3]
2 : [2, - 4, 8, 3]
3 : [3, 2, - 4, 8, 3]
^ : [8, - 4, 8, 3]
^ : [65536, 8, 3]
/ : [1.220703125e-4, 3]
+ : [3.0001220703125]
(%o5) 3.0001220703125

View file

@ -0,0 +1,118 @@
.ig
RPN parser implementation in TROFF
Originally written on November 21, 2017.
Modified for Rosettacode on December 3, 2017.
Stephanie Björk (Katt) <katt16777216@gmail.com>
..
.\" \(*A stack implementation
.nr Ac 0
.af Ac 1
.de APUSH
.if (\\n(Ac>=0)&(\\n(Ac<27) \{ \
. nr Ac +1
. af Ac A
. nr A\\n(Ac \\$1
. af Ac 1
\}
..
.de APOP
.if (\\n(Ac>0)&(\\n(Ac<27) \{ \
. af Ac A
. rr A\\n(Ac \\$1
. af Ac 1
. nr Ac -1
..
.\" Facility to print entire stack
.de L2
.af Ac 1
.if \\n(Li<=\\n(Ac \{ \
. af Li A
\\n(A\\n(Li
. af Li 1
. nr Li +1
. L2
\}
..
.de APRINT
.nr Li 1
.L2
.br
..
.\" Integer exponentiation algorithm
.de L1
.if \\n(Li<\\$2 \{ \
. nr Rs \\n(Rs*\\$1
. nr Li +1
. L1 \\$1 \\$2
\}
..
.de EXP
.nr Li 0
.nr Rs 1
.L1 \\$1 \\$2
..
.\" RPN Parser
.de REAP
.af Ac A
.nr O2 \\n(A\\n(Ac
.af Ac 1
.nr Ai \\n(Ac-1
.af Ai A
.nr O1 \\n(A\\n(Ai
.APOP
.APOP
..
.de RPNPUSH
.ie '\\$1'+' \{ \
. REAP
. nr Rs \\n(O1+\\n(O2
\}
.el \{ \
. ie '\\$1'-' \{ \
. REAP
. nr Rs \\n(O1-\\n(O2
\}
. el \{ \
. ie '\\$1'*' \{ \
. REAP
. nr Rs \\n(O1*\\n(O2
\}
. el \{ \
. ie '\\$1'/' \{ \
. REAP
. nr Rs \\n(O1/\\n(O2
\}
. el \{ \
. ie '\\$1'%' \{ \
. REAP
. nr Rs \\n(O1%\\n(O2
\}
. el \{ \
. ie '\\$1'^' \{ \
. REAP
. EXP \\n(O1 \\n(O2
\}
. el .nr Rs \\$1
\}
\}
\}
\}
\}
.APUSH \\n(Rs
.APRINT
..
.de RPNPRINT
.if \\n(Ac>1 .tm ERROR (rpn.roff): Malformed input expression. Evaluation stack size: \\n(Ac > 1 .
\\n(AA
..
.de RPNPARSE
.RPNPUSH \\$1
.ie \\n(.$>1 \{ \
. shift
. RPNPARSE \\$@
\}
.el .RPNPRINT
..
.RPNPARSE 3 4 2 * 1 5 - 2 3 ^ ^ / + \" Our input expression

View file

@ -0,0 +1,14 @@
3
3 4
3 4 2
3 8
3 8 1
3 8 1 5
3 8 4
3 8 4 2
3 8 4 2 3
3 8 4 8
3 8 16
3 0
3
3

View file

@ -0,0 +1,89 @@
.ig
===========================
Array implementation
===========================
..
.de end
..
.de array
. nr \\$1.c 0 1
. de \\$1.push end
. nr \\$1..\\\\n+[\\$1.c] \\\\$1
. end
. de \\$1.pop end
. if \\\\n[\\$1.c]>0 \{ \
. rr \\$1..\\\\n[\\$1.c]
. nr \\$1.c -1\
. \}
. end
. de \\$1.dump end
. nr i 0 1
. rm ou
. while \\\\n+i<=\\\\n[\\$1.c] \{ \
. as ou "\\\\n[\\$1..\\\\ni]
. \}
. tm \\\\*(ou
. rr i
. end
..
.ig
==========================
End array implementation
==========================
..
.array stack
.de hyper3
. nr rs 1
. nr i 0 1
. while \\n+i<=\\$2 .nr rs \\n(rs*\\$1
. rr i
..
.de pop2
. nr O2 \\n[\\$1..\\n[\\$1.c]]
. \\$1.pop
. nr O1 \\n[\\$1..\\n[\\$1.c]]
. \\$1.pop
..
.de rpn
. ie '\\$1'+' \{ \
. pop2 stack
. nr rs \\n(O1+\\n(O2
. \}
. el \{ \
. ie '\\$1'-' \{ \
. pop2 stack
. nr rs \\n(O1-\\n(O2
. \}
. el \{ \
. ie '\\$1'*' \{ \
. pop2 stack
. nr rs \\n(O1*\\n(O2
. \}
. el \{ \
. ie '\\$1'/' \{ \
. pop2 stack
. nr rs \\n(O1/\\n(O2
. \}
. el \{ \
. ie '\\$1'%' \{ \
. pop2 stack
. nr rs \\n(O1%\\n(O2
. \}
. el \{ \
. ie '\\$1'^' \{ \
. pop2 stack
. hyper3 \\n(O1 \\n(O2
. \}
. el .nr rs \\$1
. \}\}\}\}\}
.
. stack.push \\n(rs
. stack.dump
.
. if \\n(.$>1 \{ \
. shift
. rpn \\$@
. \}
..
.rpn 3 4 2 * 1 5 - 2 3 ^ ^ / +
.stack.dump

View file

@ -0,0 +1,14 @@
3
3 4
3 4 2
3 8
3 8 1
3 8 1 5
3 8 -4
3 8 -4 2
3 8 -4 2 3
3 8 -4 8
3 8 16
3 0
3
3

View file

@ -0,0 +1,39 @@
estack = [];
epush(x) = {
estack = vector(#estack + 1, i, if(i <= #estack, estack[i], x));
return(#estack);
};
epop() = {
local(val = estack[#estack]);
estack = vector(#estack - 1, i, estack[i]);
return(val);
};
registerRPNToken(t) = {
local(o1, o2);
if(type(t) == "t_STR",
if(t == "+", o2 = epop(); o1 = epop(); epush(o1 + o2),
if(t == "-", o2 = epop(); o1 = epop(); epush(o1 - o2),
if(t == "*", o2 = epop(); o1 = epop(); epush(o1 * o2),
if(t == "/", o2 = epop(); o1 = epop(); epush(o1 / o2),
if(t == "%", o2 = epop(); o1 = epop(); epush(o1 % o2),
if(t == "^", o2 = epop(); o1 = epop(); epush(o1 ^ o2)
)))))),
if(type(t) == "t_INT" || type(t) == "t_REAL" || type(t) == "t_FRAC",
epush(t))
);
print(estack);
};
parseRPN(s) = {
estack = [];
for(i = 1, #s, registerRPNToken(s[i]));
if(#estack > 1, error("Malformed postfix expression."));
return(estack[1]);
};
parseRPN([3, 4, 2, "*", 1, 5, "-", 2, 3, "^", "^", "/", "+"]); \\ Our input expression

View file

@ -0,0 +1,13 @@
[3]
[3, 4]
[3, 4, 2]
[3, 8]
[3, 8, 1]
[3, 8, 1, 5]
[3, 8, -4]
[3, 8, -4, 2]
[3, 8, -4, 2, 3]
[3, 8, -4, 8]
[3, 8, 65536]
[3, 1/8192]
[24577/8192]

View file

@ -0,0 +1,65 @@
#!/bin/sh
exp() {
R=1
local i=1
while [ $i -le $2 ]; do
R=$(($R * $1))
i=$(($i + 1))
done
}
rpn() {
local O1 O2 stack
while [ $# -ge 1 ]; do
grep -iE '^-?[0-9]+$' <<< "$1" > /dev/null 2>&1
if [ "$?" -eq 0 ]; then
stack=`sed -e '$a'"$1" -e '/^$/d' <<< "$stack"`
else
grep -iE '^[-\+\*\/\%\^]$' <<< "$1" > /dev/null 2>&1
if [ "$?" -eq 0 ]; then
O2=`sed -n '$p' <<< "$stack"`
stack=`sed '$d' <<< "$stack"`
O1=`sed -n '$p' <<< "$stack"`
case "$1" in
'+')
stack=`sed -e '$a'"$(($O1 + $O2))" -e '/^$/d' -e '$d' \
<<< "$stack"`;;
'-')
stack=`sed -e '$a'"$(($O1 - $O2))" -e '/^$/d' -e '$d' \
<<< "$stack"`;;
'*')
stack=`sed -e '$a'"$(($O1 * $O2))" -e '/^$/d' -e '$d' \
<<< "$stack"`;;
'/')
stack=`sed -e '$a'"$(($O1 / $O2))" -e '/^$/d' -e '$d' \
<<< "$stack"`;;
'%')
stack=`sed -e '$a'"$(($O1 % $O2))" -e '/^$/d' -e '$d' \
<<< "$stack"`;;
'^')
exp $O1 $O2
stack=`sed -e '$a'"$(($R))" -e '/^$/d' -e '$d' <<< \
"$stack"`;;
esac
else
echo "Unknown RPN token \`\`$1''"
fi
fi
echo "$1" ":" $stack
shift
done
sed -n '1p' <<< "$stack"
if [ "`wc -l <<< "$stack"`" -gt 1 ]; then
echo "Malformed input expression" > /dev/stderr
return 1
else
return 0
fi
}
rpn 3 4 2 '*' 1 5 '-' 2 3 '^' '^' '/' '+'

View file

@ -0,0 +1,14 @@
3 : 3
4 : 3 4
2 : 3 4 2
* : 3 8
1 : 3 8 1
5 : 3 8 1 5
- : 3 8 -4
2 : 3 8 -4 2
3 : 3 8 -4 2 3
^ : 3 8 -4 8
^ : 3 8 65536
/ : 3 0
+ : 3
3