Em org-mode
, estou tentando definir uma função, uma variável e, em seguida, atribuindo a outra variável o resultado da chamada de função na primeira variável. No entanto, parece que não posso usar essa nova variável em chamadas de funções subseqüentes.
A inclusão de chamadas de função funciona, mas afetar o valor de uma variável primeiro permitiria uma depuração mais rápida, caso algo desse errado na primeira chamada de função, e evitar duplicação de cálculos potencialmente caros.
MWE: (use (require 'ob-emacs-lisp)
se necessário)
#+name: square
#+begin_src emacs-lisp :var x=3
(message (format "%s" (* x x)))
#+end_src
#+RESULTS: square
: 9
#+name: value
: 45
#+name: squaredvalue
#+call: square(x=value)
#+RESULTS: squaredvalue
: 2025
Now I try to reuse this value:
#+begin_src emacs-lisp :var res=squaredvalue
(message res)
#+end_src
#+RESULTS:
: nil
Inlined calls do work:
#+begin_src emacs-lisp :var res=square(value)
(message res)
#+end_src
#+RESULTS:
: 2025
A expansão do segundo bloco de código mostra:
(let ((res (quote "nil")))
(message res))
o que estou perdendo?
(Isso foi testado no emacs 24.3.1, 24.4 e 24.5, usando a organização 8.2.10)
Respostas:
Adicione explicitamente novo
#+name:
acima do#+results:
bloco.fonte
#+name:
antes da#+call:
linha, portanto, não adiciona nenhuma contabilidade ao processo: apenas nomeie os resultados em vez da definição. Talvez não pareça tão natural quanto possível, mas pelo menos isso não é uma solução alternativa que implora por uma solução alternativa.-result
não retorne resultados. Adicione uma observação de que é necessário nomear a chamada e que o nome do resultado deve ser o nome da chamada com o sufixo-result
. Pelo menos foi o que eu notei. (Se alguém falhar em nomear a chamada, a próxima reavaliação adicionará um novo resultado, ignorando o resultado nomeado existente.-result
é apenas uma convenção de nomenclatura que usei para este exemplo. Se você estiver procurando explicitamente os resultados de um bloco de origem, adicione()
-o ao passar o nome como uma variável para outro bloco ou dentro de uma referência noweb.#+call
nomeado. O nome do resultado pode ser escolhido arbitrariamente. Se a chamada não for nomeada, uma linha de resultado adicional sem nome será gerada pela chamada.Você pode usar uma
:post
rotina-que gera o resultado como:name
. Ligue para o seu bloco de notas com esta rotina de postagem e coloque o resultado em uma gaveta. No exemplo a seguir, essa rotina de postagem é nomeadaasValue
.Outra maneira de evitar o recálculo dos blocos de código é o
:cache
argumento do cabeçalho. Se isso estiver definido comoyes
o bloco de código e seus argumentos forem verificados quanto a alterações e se não houver alterações, o resultado anterior será usado sem reavaliação do bloco de código-fonte.fonte
:cache yes
) é a solução padrão. Ele também é descrito no manual (consulte a seção 14.8.2.16:cache'). It is a pity that it does not smoothly work with
# + call. I think this is a bug. The first solution works with
# + call` e também tem a vantagem de desacoplar completamente os blocos de código. Mesmo se você editar o primeiro bloco de código e tentar o segundo, o primeiro não é avaliado (Dependendo da tarefa que pode ser uma vantagem ou um disatvantage Você apenas tem que manter isso em mente..).Eu suspeito que você só precisa atualizar o modo Org. Isso funciona no meu final (versão atual de desenvolvimento da organização) e, em geral, deve funcionar como na tag
release_8.3beta
. Abaixo está o commit que acho que corrige o problema que você está descrevendo.Além de carregar a Org a partir do repositório git, outra opção para executar uma versão mais recente é instalar o pacote ELPA .
fonte
;)
Para ser preciso, o meuorg-version
é 8.2.10. Editei a pergunta com esta informação, onde deveria estar em primeiro lugar.