## Eev hacks for Maxima
- 1. eepitch-maxima
- 2. find-angg-es-links
- 3. Elisp hyperlinks
- 4. Embedding in LaTeX
- 5. "Physicist's notation"
- 6. Substitution
- 7. Luatree
- 8. Maxima by Example
- 9. Debugging the Lisp (with Sly)
## 1. eepitch-maximaI use eepitch to send lines from Emacs to Maxima; see the figure below for the main idea, and my presentation at the EmacsConf2021 for the details. The definition of eepitch-maxima in eev is the simplest possible - just this:
I tried to write variants that used Fermin MF's maxima-mode instead of just comint, but his maxima-mode behaved in weird ways when it had to send empty lines, and we couldn't fix that easily... so I gave up. ## 2. find-angg-es-linksThe video below explains a way to run my executable notes on Maxima
with eev Click on the second screenshot to play (or to read the subtitles
of) the video starting from 11:30. That part has a very
technical explanation of the " ## 3. Elisp hyperlinksMy notes on Maxima in maxima.e contain lots of elisp hyperlinks like these ones,
that are htmlized in special ways. They are explained in these other pages: find-maximanode, find-maximamsg. ## 4. Embedding in LaTeXHere is an example of how I am embedding Maxima code in LaTeX files; the trick that makes eepitch ignore a prefix is explained here. If I execute that eepitch block skipping the lines "load" and "display2d" I get a human-friendly output, as in the first screenshot below; if I execute the lines "load" and "display2d" I get an output that I can process with M-x emaxima-conv (that calls emaxima.lua) to obtain this LaTeX code, that becomes this in the PDF. This trick is based on the answers that I got for this question that I sent to Maxima mailing list; note that 1) I am using this copy of emaxima.sty that has two lines commented out, and 2) my emaxima.lua is a quick hack, and it should be converted to elisp at some point. TODO: explain why I gave up using emaxima.sty and how I switched to a solution that uses Lpeg. ## 5. "Physicist's notation"First version: In 2022jan10 I sent to the Maxima
mailing list this big e-mail, that had two parts. In
the first part I asked about the (internal) differences between using
expressions, like "f : x^2", and using functions, like "g(x) := x^3"; the code associated to
that part is here. In the second part I asked if, and
how, Maxima supports "physicists' notation" - where "physicists'
notation" ("PN") is my informal name for a notation that is common in
old books like this one by Silvanus Thompson. In
PN variables and functions can share the same names, variables can be
"dependent", some arguments can be omitted, and several abbreviations
are standard - for example, if y=y(x) then the default meaning for
y Second version (sep/2023): my sample space is small - about 25 people - but apparently in Brazil, - "all" the "P"ure mathematicians ("group P") treat dependent variables and differentials as abuses of language,
- "all" the "A"pplied mathematicians, physicists and engineers ("group A") treat dependent variables and differentials as something that "everybody knows", and
- no one in either of the two groups knows the exact rules for translating the language of "Calculus with dependent variables and differentials" ("Calculus+") into the language of "Calculus without dependent variables and differentials" ("Calculus-")...
...so "no one" here knows how write an "elaborator", in this sense, that could translate "Calculus+" into "Calculus-". I grew up in Group A and my native language is "Calculus-", but now in my day job I'm teaching integration using books that use "Calculus+", and I thought that the best way to handle my embarassment for not speaking "Calculus+" well enough would be to formalize how that translation can be done. I'm ## 6. SubstitutionMy first attempts to understand how Maxima implements the "#$expr$" syntax in Lisp are here: 1, 2, 3. Then Stavros Macrakis explained how I could define "dosimp" and "doeval" and I produced the example below. Its code is here. My long e-mail explaining why I am teaching substitution in this way is here (includes gossip). ## 7. LuatreeTo draw Maxima objects as trees - as in the first screenshot below - I use a program that is made of three files: luatree.mac, luatree.lisp, luatree.lua. Its git repo is here, and you can test it by running the test block at the end of luatree.mac. There is an explanation of luatree here. The screenshot at the right below shows a (primitive) port of luatree to SymPy. Its code is here: luatree.py. ## 8. Maxima by ExampleThe best place for learning Maxima from examples is a (free) book whose name is - ta-daaa! - Maxima by Example. It is divided into chapters, and my script to download a local copy of it is here. Its chapter 13 is about qdraw, that is a front-end to Maxima's plot and draw commands. I find qdraw much easier to use than plot and draw; for example, the code for drawing the Lissajous figure below - with velocity and acceleration vectors! - is just this. The second screenshot shows a trajectory P(t) = (cos t, sin t), the
parabola Q(t) = P(0) + t·P'(0) + t ## 9. Debugging the Lisp (with Sly)Most people use Slime and Swank to debug the Lisp code of Maxima. I couldn't make Slime work with eepitch, so instead of Slime and Swank I'm using Sly, Slynk, and an eepitch-sly defined in this way, and I had to adapt these instructions. My code to use Sly and Slynk in Maxima is here: ~/.maxima/startsly.lisp. See also this: eev-sly.html. |