demo_pascal_diff.htm
来自「Delphi脚本控件」· HTM 代码 · 共 482 行 · 第 1/3 页
HTM
482 行
<html>
<head>
<link rel=stylesheet type="text/css" href="styles.css">
</head>
<body>
<h3>
LISPPA: Symbolic differentiation (paxPascal).
</h3>
<hr>
<blockquote>
<pre>
// Gramma:
// Expression = Term { ( "+"|"-") Term }
// Term = Multiplier { "*"|"/" ) Multiplier }
// Multiplier = Factor { "^" Factor }
// Factor = Number | "X" | "ln" "(" Expression ")" | "(" Expression ")" "-" Factor
// Number = Digit { Digit }
// Digit = "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9"
<font color="blue"><b>program</b></font> SymbolicDifferentiation;
<font color="blue"><b>const</b></font>
X = <font color="Red">'X'</font>;
OP_ADD = <font color="Red">'+'</font>;
OP_MULT = <font color="Red">'*'</font>;
OP_SUB = <font color="Red">'-'</font>;
OP_DIV = <font color="Red">'/'</font>;
OP_UN = <font color="Red">'~'</font>;
OP_LOG = <font color="Red">'ln'</font>;
OP_POW = <font color="Red">'^'</font>;
<font color="blue"><b>function</b></font> IsVar(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
result := isString(Term);
<font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
result := Term =<font color="Red">'X'</font>;
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> IsConstant(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
result := isNumber(Term);
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> IsZero(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
result:= IsConstant(Term);
<font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
result := Term = 0;
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> IsUnit(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
result := IsConstant(Term);
<font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
result := Term = 1;
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> IsCompound(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
result := isPaxArray(Term);
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> IsPow(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
result := IsCompound(Term);
<font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
result := Term[0] = OP_POW;
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> IsMult(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
result := IsCompound(Term);
<font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
result := Term[0] = OP_MULT;
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> IsAdd(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
result := IsCompound(Term);
<font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
result := Term[0] = OP_ADD;
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> IsSub(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
result := IsCompound(Term);
<font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
result := Term[0] = OP_SUB;
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> IsNeg(<font color="blue"><b>const</b></font> Term: Variant): boolean;
<font color="blue"><b>begin</b></font>
result := IsCompound(Term);
<font color="blue"><b>if</b></font> result <font color="blue"><b>then</b></font>
result := Term[0] = OP_UN;
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> Diff(<font color="blue"><b>const</b></font> A: Variant): Variant;
<font color="blue"><b>var</b></font>
X1, X2, R1, R2, R3: Variant;
Oper: <font color="blue"><b>String</b></font>;
<font color="blue"><b>begin</b></font>
<font color="blue"><b>if</b></font> IsCompound(A) <font color="blue"><b>then</b></font>
<font color="blue"><b>begin</b></font>
Oper := A[0];
X1 := @A[1];
<font color="blue"><b>if</b></font> A.length >= 3 <font color="blue"><b>then</b></font>
X2 := @A[2];
<font color="blue"><b>if</b></font> Oper = OP_ADD <font color="blue"><b>then</b></font>
result := [Oper, Diff(X1), Diff(X2)]
<font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_SUB <font color="blue"><b>then</b></font>
result := [Oper, Diff(X1), Diff(X2)]
<font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_UN <font color="blue"><b>then</b></font>
result := [Oper, Diff(X1)]
<font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_MULT <font color="blue"><b>then</b></font>
result := [OP_ADD, [OP_MULT, Diff(X1), X2], [OP_MULT, X1, Diff(X2)]]
<font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_DIV <font color="blue"><b>then</b></font>
<font color="blue"><b>begin</b></font>
R1 := [OP_DIV, Diff(X1), X2];
R2 := [OP_MULT, X1, Diff(X2)];
R3 := [OP_MULT, X2, X2];
result := [OP_SUB, R1, [OP_DIV, R2, R3]];
<font color="blue"><b>end</b></font>
<font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_LOG <font color="blue"><b>then</b></font>
result := [OP_DIV, Diff(X1), X1]
<font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> Oper = OP_POW <font color="blue"><b>then</b></font>
<font color="blue"><b>begin</b></font>
R1 := [OP_MULT, Diff(X1), [OP_MULT, X2, [OP_POW, X1, [OP_SUB, X2, 1]]]];
R2 := [OP_MULT, Diff(X2), [OP_MULT, [OP_LOG, X1], [OP_POW, X1, X2 ]]];
result := [OP_ADD, R1, R2];
<font color="blue"><b>end</b></font>
<font color="blue"><b>else</b></font>
<font color="blue"><b>println</b></font> <font color="Red">'Syntax error !'</font>;
<font color="blue"><b>end</b></font>
<font color="blue"><b>else</b></font> <font color="blue"><b>if</b></font> IsVar(A) <font color="blue"><b>then</b></font>
result := 1
<font color="blue"><b>else</b></font>
result := 0;
<font color="blue"><b>end</b></font>;
<font color="blue"><b>function</b></font> InOrder(<font color="blue"><b>const</b></font> A: Variant): <font color="blue"><b>String</b></font>;
<font color="blue"><b>var</b></font>
LL, RR, Oper: <font color="blue"><b>String</b></font>;
<font color="blue"><b>begin</b></font>
<font color="blue"><b>if</b></font> IsCompound(A) <font color="blue"><b>then</b></font>
<font color="blue"><b>begin</b></font>
<font color="blue"><b>if</b></font> A.length = 2 <font color="blue"><b>then</b></font>
<font color="blue"><b>begin</b></font>
Oper := A[0];
<font color="blue"><b>if</b></font> Oper = OP_UN <font color="blue"><b>then</b></font>
Oper := OP_SUB;
RR := InOrder(A[1]);
<font color="blue"><b>if</b></font> (Oper = OP_LOG) <font color="blue"><b>and</b></font> (Copy(RR, 1, 1) <> <font color="Red">'('</font>) <font color="blue"><b>then</b></font>
result := <font color="Red">'ln'</font> + <font color="Red">'('</font> + RR + <font color="Red">')'</font>
<font color="blue"><b>else</b></font>
result := <font color="Red">'('</font> + Oper + RR + <font color="Red">')'</font>;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?