Fazer com que as fórmulas de tabela no modo organizacional usem precedência aritmética comum

7

Dado este documento no modo organizacional:

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

A avaliação das fórmulas produz (na segunda célula) o resultado surpreendente 1, em vez de (4/2 * 2 =) 4.

Aparentemente, a multiplicação tem uma precedência mais alta nas fórmulas no modo org do que na divisão, que pode (ocasionalmente silenciosamente) produzir resultados inesperados.

Existe uma maneira de fazer com que as fórmulas no modo organizacional usem precedência aritmética comum do operador, como na maioria das notações em correção?

Vladimir Panteleev
fonte

Respostas:

8

Você pode apenas usar outro idioma para calc-evalno modo org, seguindo a seguinte configuração no seu arquivo init.

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

Você também pode usar M-x customize-option RET org-calc-default-modes. Insira uma entrada com chave calc-languagee valor c.

A linguagem cé apenas um exemplo aqui. Existem muitos outros idiomas. Você pode até definir seu próprio idioma . Mas para isso você precisa de algumas habilidades ...

Veja o arquivo calc-lang.elou o documento de Modos de idioma .

Tobias
fonte
@VladimirPanteleev Obrigado pela correção de erros. Eu não percebi desde que essa parte estava na quebra de linha.
Tobias
1

org-modeusa calcpara calcular fórmulas e calcusa precedência de operador não padrão. Do manual org, (org) Formula syntax for Calc:

Uma fórmula pode ser qualquer expressão algébrica entendida pelo pacote Emacs 'Calc'. Observe que 'calc' possui a convenção não padrão de que '/' tem precedência menor que '*', de modo que 'a / b * c' é interpretado como 'a / (b * c)'.

O que significa que você precisará usar colchetes para impor a precedência padrão do operador, ou seja,

| 4 | ? |
#+TBLFM: $2=($1/2)*2
Tyler
fonte
Obrigado pela explicação, mas isso não responde à pergunta indicada. A questão é como fazer o modo organizacional usar precedência aritmética comum. Simplesmente tentar se lembrar de usar a sintaxe correta para evitar resultados inesperados sempre que alguém usar tabelas no modo organizacional não é uma solução viável.
Vladimir Panteleev
A resposta para sua pergunta: "Existe uma maneira de fazer o modo organizacional usar a precedência padrão do operador?" é não". A outra alternativa integrada é usar fórmulas lisp em vez de fórmulas calc, mas isso é ainda mais distante da precedência padrão do operador.
Tyler
Desculpe, mas não estou convencido de que as coisas são como você diz. O Calc é implementado no Emacs Lisp, certo? Portanto, no mínimo, deve ser possível corrigir seu código por meio de conselhos ou algo assim. Seu manual também fala de suporte para vários idiomas com regras de precedência diferentes, então talvez isso possa ser feito como uma variável local do arquivo?
Vladimir Panteleev 30/07/19
Eu estou corrigido, consulte @Tobias resposta
Tyler