algebrite
Version:
Computer Algebra System in Coffeescript
53 lines (43 loc) • 1.01 kB
text/coffeescript
###
Substitute new expr for old expr in expr.
Input: push expr
push old expr
push new expr
Output: Result on stack
###
subst = ->
save()
newExpr = pop(); # new expr
oldExpr = pop(); # old expr
if (oldExpr == symbol(NIL) || newExpr == symbol(NIL))
restore()
return
expr = pop(); # expr
if (istensor(expr))
newTensor = alloc_tensor(expr.tensor.nelem)
newTensor.tensor.ndim = expr.tensor.ndim
for i in [0...expr.tensor.ndim]
newTensor.tensor.dim[i] = expr.tensor.dim[i]
for i in [0...expr.tensor.nelem]
push(expr.tensor.elem[i])
push(oldExpr)
push(newExpr)
subst()
newTensor.tensor.elem[i] = pop()
check_tensor_dimensions newTensor
push(newTensor)
else if (equal(expr, oldExpr))
push(newExpr)
else if (iscons(expr))
push(car(expr))
push(oldExpr)
push(newExpr)
subst()
push(cdr(expr))
push(oldExpr)
push(newExpr)
subst()
cons()
else
push(expr)
restore()