Retornando resultados de org-babel de uma chamada assíncrona

7

Atualmente, estou experimentando mover mais do meu fluxo de trabalho de desenvolvimento para o modo organizacional, para que eu possa acompanhar melhor os testes que fiz. No entanto, algumas das etapas envolvem chamadas assíncronas para serviços RPC. O seguinte trecho mostra o problema:

#+name: simple-async-example
#+begin_src emacs-lisp 
  (async-start
     ;; What to do in the child process
     (lambda ()
       (message "This is a test")
       (sleep-for 3)
       222)

     ;; What to do when it finishes
     (lambda (result)
       (format "Async process done - result should be 222: %s" result)))
#+end_src

#+RESULTS: simple-async-example
: #<process emacs>

Como você pode ver, o resultado vem da primeira tarefa. O que preciso fazer é anexar o resultado real depois que o processamento for concluído. Existe alguma maneira de conseguir isso?

stsquad
fonte
11
Além do título, não está claro qual é a sua pergunta. Respondendo ao título, acho que essa pergunta aparece frequentemente na lista de e-mails da organização e a resposta "não é suportada no momento".
Mankoff
@mankoff: OK. Eu reformulei e simplifiquei a pergunta para tentar facilitar o acompanhamento. Isto é melhor?
Stsquad
pt.wikipedia.org/wiki/Minimal_Working_Example Por que não ter um script bash de 3 linhas que retorne algo assíncrono que qualquer um possa executar / testar / entender?
Mankoff
@ mankoff: bem bash é inerentemente síncrona, não é? Eu envolvi todo o material de compilação e upload em um script para simplificá-lo, mas o envio de trabalhos da LAVA é algo que acontece de forma assíncrona no emacs.
Stsquad
@mankoff: Como está o novo exemplo do elisp?
Stsquad

Respostas:

4

OK Resolvendo o exemplo (assíncrono) que criei esse hack. Seria bom se eu pudesse obter automaticamente o nome do bloco de origem ao invés de repeti-lo como um var.

** Post-modify the org-result
#+name: simple-async-with-post-modify
#+begin_src emacs-lisp :var this-buffer=(buffer-name (current-buffer)) this-name="simple-async-with-post-modify"
  (async-start
     ;; What to do in the child process
   `(lambda ()
     (message "This is a test")
     (sleep-for 3)
     ,(async-inject-variables "this-buffer")
     ,(async-inject-variables "this-name")
     (list
        (cons 'buffer this-buffer)
        (cons 'name this-name)
        (cons 'result 222)))

     ;; What to do when it finishes
   (lambda (result)
     (let ((buf (cdr (assoc 'buffer result)))
           (name (cdr (assoc 'name result)))
           (res (cdr (assoc 'result result))))
       (save-excursion
         (with-current-buffer buf
           (org-babel-goto-named-result name)
           (next-line)
           (goto-char (org-babel-result-end))
           (org-babel-insert-result (format "we got: %s" res)))))))
#+end_src

#+RESULTS: simple-async-with-post-modify
: #<process emacs>
: we got: 222
stsquad
fonte
11
Oi. Há uma postagem de John Kitchin discutindo uma solução de protótipo para blocos de código python que pode ser interessante para você.
dfeich