Devolver los resultados de org-babel de una llamada asincrónica

7

Actualmente estoy experimentando con mover más de mi flujo de trabajo de desarrollo al modo org para poder hacer un mejor seguimiento de las pruebas que he realizado. Sin embargo, algunos de los pasos implican llamadas asincrónicas a los servicios RPC. El siguiente fragmento muestra el 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 puede ver, el resultado proviene de la primera tarea. Lo que necesito hacer es agregar el resultado real una vez que se haya completado el procesamiento. ¿Hay alguna forma de lograr esto?

stsquad
fuente
1
Aparte del título, en realidad no está claro cuál es su pregunta. Respondiendo el título, creo que esta pregunta aparece a menudo en la lista de correo electrónico de Org, y la respuesta "actualmente no es compatible".
mankoff
@mankoff: OK, redacté y simplifiqué la pregunta para intentar que sea más fácil de seguir. ¿Eso está mejor?
stsquad
en.wikipedia.org/wiki/Minimal_Working_Example ¿por qué no tener un script bash de 3 líneas que devuelva algo asíncrono que cualquiera pueda ejecutar / probar / entender?
mankoff
@mankoff: bueno, bash es inherentemente sincrónico, ¿no? Envolví toda la compilación y cargué cosas en un script para simplificarlo, pero el envío del trabajo LAVA es algo que ocurre de forma asincrónica dentro de emacs.
stsquad
@mankoff: ¿Cómo es el nuevo ejemplo de elisp?
stsquad

Respuestas:

4

OK Resolviendo el ejemplo (asíncrono) se me ocurrió este truco. Sería bueno si pudiera obtener automáticamente el nombre del bloque fuente en lugar de tener que repetirlo como 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
fuente
1
Hola. Hay una publicación de John Kitchin que discute una solución prototipo para bloques de código de Python que podría ser interesante para usted.
dfeich