Частные символы для sum(), 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. Но я надеюсь, что должно быть более идиоматическое решение. Есть что-то?


person firegurafiku    schedule 27.07.2015    source источник


Ответы (1)


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

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

person Robert Dodier    schedule 30.07.2015
comment
Печально. Я думаю, что пока буду придерживаться префиксов или подчеркивания. - person firegurafiku; 01.08.2015
comment
Да, я думаю, что выбор необычных имен, чтобы избежать конфликтов имен, является рабочим решением. Хорошей новостью является то, что я думаю, что реализация лексических символов может быть не слишком трудоемкой, на самом деле, и я почти уверен, что очень немногим программам на самом деле требуется динамическая область видимости для правильной работы, поэтому переход на лексическую область видимости может быть не слишком сложным. на практике. - person Robert Dodier; 04.08.2015