Stellen Sie fest, dass Tabellenformeln im Organisationsmodus die gängige arithmetische Priorität haben

7

Angesichts dieses Dokuments im Organisationsmodus:

| 4 | ? |
#+TBLFM: $2=$1/2*2

Die Auswertung der Formeln ergibt (in der zweiten Zelle) das überraschende Ergebnis 1 anstelle von (4/2 * 2 =) 4.

Offensichtlich hat die Multiplikation in Formeln im org-Modus eine höhere Priorität als die Division, was (gelegentlich lautlos) zu unerwarteten Ergebnissen führen kann.

Gibt es eine Möglichkeit, Formeln im Organisationsmodus wie in den meisten In-Fix-Notationen die gängige Priorität für arithmetische Operatoren zu verwenden?

Vladimir Panteleev
quelle

Antworten:

8

Sie können einfach eine andere Sprache für calc-evalim Organisationsmodus verwenden, indem Sie die folgende Einstellung in Ihrer Init-Datei vornehmen.

(setq org-calc-default-modes (append '(calc-language c) org-calc-default-modes))

Sie können auch verwenden M-x customize-option RET org-calc-default-modes. Fügen Sie einen Eintrag mit Schlüssel calc-languageund Wert ein c.

Die Sprache cist hier nur ein Beispiel. Es gibt viel mehr Sprachen. Sie können sogar Ihre eigene Sprache definieren . Aber dafür braucht man einige Fähigkeiten ...

Siehe Datei calc-lang.eloder Dokument der Sprachmodi .

Tobias
quelle
@VladimirPanteleev Danke für die Fehlerkorrektur. Ich habe es nicht bemerkt, da dieses Bit am Zeilenumbruch war.
Tobias
1

org-modewird calczum Berechnen von Formeln calcverwendet und verwendet nicht standardmäßige Operatorpriorität. Aus dem Organisationshandbuch (org) Formula syntax for Calc:

Eine Formel kann ein beliebiger algebraischer Ausdruck sein, der vom Emacs-Paket 'Calc' verstanden wird. Beachten Sie, dass 'calc' die nicht standardmäßige Konvention hat, dass '/' eine niedrigere Priorität als '*' hat, so dass 'a / b * c' als 'a / (b * c)' interpretiert wird.

Dies bedeutet, dass Sie Klammern verwenden müssen, um die Priorität des Standardoperators festzulegen, d. H.

| 4 | ? |
#+TBLFM: $2=($1/2)*2
Tyler
quelle
Vielen Dank für die Erklärung, aber das beantwortet die angegebene Frage nicht wie angegeben. Die Frage ist , wie man macht org-Modus verwendet gemeinsamen arithmetischen Vorrang. Es ist keine praktikable Lösung, sich nur daran zu erinnern, die richtige Syntax zu verwenden, um unerwartete Ergebnisse bei jeder Verwendung von Tabellen im Organisationsmodus zu vermeiden.
Vladimir Panteleev
Die Antwort auf Ihre Frage: "Gibt es eine Möglichkeit, den Organisationsmodus so zu gestalten, dass er die Priorität eines Standardoperators verwendet?" ist "nein". Die andere integrierte Alternative ist die Verwendung von Lisp-Formeln anstelle von Calc-Formeln. Dies ist jedoch noch weiter von der Priorität des Standardoperators entfernt.
Tyler
Entschuldigung, aber ich bin nicht überzeugt, dass die Dinge so sind, wie Sie sagen. Calc ist in Emacs Lisp implementiert, richtig? Zumindest sollte es also möglich sein, seinen Code durch Ratschläge oder ähnliches zu patchen. Das Handbuch spricht auch von der Unterstützung mehrerer Sprachen mit unterschiedlichen Vorrangregeln. Könnte dies also möglicherweise als dateilokale Variable erfolgen?
Vladimir Panteleev
Ich stehe korrigiert, siehe @ Tobias Antwort
Tyler