2015-07-27 9 views
1

Рассмотрим следующую функцию я уже упоминал в моем previous question:«Частные» символы для суммы(), Diff(), или интегрировать()

rot[i](f) := sum(sum(sum(sum(
     G[r,i]*G[q,j]*W[i,j,k]*('diff(f[k], y[q]) + sum(K[k,q,m]*f[m], m, 1, N)), 
      r, 1, N), 
      j, 1, N), 
      k, 1, N), 
      q, 1, N) $ 

Это вид работ в целом, но что если исходное выражение f уже содержит символы r, j и т. д.? В этом случае это не так. Единственным решением, которое я нашел до сих пор, является использование некоторого уникального префикса для этих символов или, по крайней мере, начало их имен с символом подчеркивания: r__r, j__j. Но я надеюсь, что должно быть более идиоматическое решение. Есть что-нибудь?

ответ

1

К сожалению, в Maxima все символы являются фактически глобальными - x в некотором выражении является тем же символом, что и x в f(x) := .... Таким образом, нет общего способа гарантировать, что аргументы функции отличаются от других символов с одним и тем же именем. Некоторые функции пытаются сделать свои аргументы локальными, например, sum обрабатывает индексную переменную специально, но integrate этого не делает.

Я попытался сделать лексическую конструкцию блока, которая позволила бы различать символы с одним и тем же именем. Это называется , и я думаю, что поиск в Интернете должен найти его, если нет, сообщите мне, и я отправлю ссылку.

+0

Это печально. Я думаю, что сейчас буду придерживаться префиксов или подчеркиваний. – firegurafiku

+0

Да, я думаю, что сейчас выбор необычных имен, чтобы избежать столкновений имен, является работоспособным решением. Хорошая новость заключается в том, что я считаю, что реализация лексических символов может быть не слишком большой, на самом деле, и я уверен, что очень немногим программам на самом деле требуется динамическая область для правильной работы, поэтому переход на лексическую сферу может быть не слишком сложным на практике. –