¿Se pueden generar los resultados de org-babel como comentarios de código?

13

En blogs, libros de texto, etc., es muy común mostrar los resultados de algunos códigos como comentarios, por ejemplo:

(+ 1 1) ;=> 2

¿Hay alguna manera de mostrar resultados como este automáticamente usando la función Babel de Org-Mode?

Específicamente, lo que me gustaría es poder especificar un encabezado tal que esto:

#+begin_src scheme <some headers>
(+ 1 1)
(/ 4 (* 2 2))
#+end_src

Se convertiría en lo siguiente cuando yo C-c C-c:

#+begin_src scheme <some headers>
(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1
#+end_src

Y luego, si hice algunos cambios, así ...

#+begin_src scheme <some headers>
(+ 1 5) ;=> 2
(/ 8 (* 2 2)) ;=> 1
#+end_src

... y C-c C-creemplazaría los comentarios con los actualizados:

#+begin_src scheme <some headers>
(+ 1 5) ;=> 6
(/ 8 (* 2 2)) ;=> 2
#+end_src

O, por debajo de lo que he soñado anteriormente, ¿hay una manera fácil de mostrar los resultados mediante el renderizador de archivos org de github, de modo que lo siguiente sería visible (idealmente con el formato que especifico a nivel de documento):

#+RESULTS:
: 2
parkeristyping
fuente
Idea interesante, pero no creo que haya nada listo. Intentaría modificar el backend específico de Babel para colocar los resultados en el lugar predeterminado. Aunque esto parece complicado, cuando los resultados tienen múltiples líneas, por ejemplo.
wvxvw

Respuestas:

7

prueba esto

Use bloques de código con nombre y nowebencabezado para convertir su código en un programa alfabetizado.

#+NAME: my-code
#+BEGIN_SRC elisp :exports none 
(+ 1 1)
#+END_SRC

#+NAME: my-other-code 
#+BEGIN_SRC elisp :exports none 
(/ 4 (* 2 2))
#+END_SRC

Cree un orgbloque de código para formatear su código con su resultado

#+BEGIN_SRC org :results drawer replace :noweb yes :exports results 

  ,#+NAME: my-code-with-answer
  ,#+BEGIN_SRC elisp  :exports code 
  <<my-code>> ;=> <<my-code()>>
  <<my-other-code>> ;=> <<my-other-code()>>
  ,#+END_SRC


#+END_SRC

¿Es una C-c C-cde orgbloque de código y debería ver resultados similares a los del código de abajo:

#+RESULTS:
:RESULTS:

#+NAME: my-code-with-answer
#+BEGIN_SRC elisp  :exports code 
(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1
#+END_SRC

:END:

Si publicas código en Github, deberías ver

(+ 1 1) ;=> 2
(/ 4 (* 2 2)) ;=> 1

Este código se probó con
GNU Emacs 24.5.1 (x86_64-unknown-cygwin, GTK + Versión 3.14.13) Versión
Org-Mode: 8.3.2
y github.

Melioratus
fuente
Gracias. Este es un enfoque útil y parece lo suficientemente flexible como para permitir el formateo de los resultados de la forma que desee. Pero, creo que (como mi propia solución) es demasiado detallado para ser conveniente para notas rápidas o publicaciones de blog, que es lo que esperaba encontrar. Sin embargo, quizás algunas modificaciones al desarrollo de Babel sobre esta funcionalidad podrían llevarme allí.
parkeristyping
1
@parkeristyping - Estoy de acuerdo. Es demasiado detallado. Si es algo que voy a hacer con bastante frecuencia, por ejemplo, blog, generalmente escribo un código de plantilla para generar el código organizativo formateado en el paso 2. Luego, simplemente actualizo una variable pasada al generador de plantillas, por ejemplo :var my_code='("my-code" "my-other-code"). Aun así, es aún más engorroso de lo que me gustaría. ¿Quieres que actualice mi respuesta?
Melioratus
@parkeristyping: acabo de descubrir otra forma, pero requiere que exporte el archivo de organización original y publique la exportación a GitHub.
Melioratus
3

Lo más cercano que he podido lograr con la funcionalidad existente de Babel es lo siguiente:

Primero, defino una función emacs-lisp para anteponer resultados con ";=> ":

#+name: commentify
#+begin_src emacs-lisp :var result="" :exports none
(concat ";=> " (format "%s" result))
#+end_src

Luego proceso los resultados usando el :postencabezado:

#+begin_src scheme :post commentify(*this*) :results code :exports both
(+ 5 7)
#+end_src

Esto devuelve lo siguiente C-c C-c, que se muestra en github debido al :exports bothencabezado, pero está en un bloque de código separado.

#+RESULTS:
#+BEGIN_SRC scheme
;=> 12
#+END_SRC

Sin embargo, creo que esta estrategia deja el archivo org demasiado abarrotado para que valga la pena. Y, a menos que desactive la confirmación de evaluación de código, tengo que aceptar dos "¿Está seguro de que desea evaluar el código?" avisos (uno para el bloque Esquema y otro para el elisp commentify).

parkeristyping
fuente
1

Puedes hacer algo como esto:

  1. Escriba su bloque de código fuente nombrado de varias líneas como de costumbre

  2. Cambie la envoltura de BEGIN/END_SRCa …-EXAMPLE:

    # + NOMBRE: fuente real
    # + BEGIN_EXAMPLE emacs-lisp
    (+ 3 4)
    (* 4 47)
    # + END_EXAMPLE
  1. Pegue y ejecute este bloque debajo del primer bloque de código.
    # + NOMBRE: LispBlock
    # + HEADER:: var lcmds = real-source
    # + BEGIN_SRC emacs-lisp: salida de resultados: wrap src emacs-lisp
    (dolist (cmd (lcmds de cadena dividida "\ n"))
      (a menos que (string = "" cmd)
        (princ
         (formato "% s \ t; →% s \ n"
                 cmd (eval (car (cmd de lectura de cadena)))))))
    # + END_SRC
  1. Resultado:
    # + RESULTADOS: LispBlock
    # + BEGIN_src emacs-lisp
    (+ 3 4); → 7
    (* 4 47); → 188
    # + END_src
  1. Agregue bloques de origen de varias líneas adicionales con nombres individuales según sea necesario en su texto

  2. Agregue #+CALL:líneas donde asigne el nombre del Bloque como lcmdsvariable. El bloque transformador anterior solo se necesita una vez por documento.

Tenga en cuenta que el bloque de transformación debe escribirse en el idioma que está tratando.

Primero intenté "automatizar" la buena solución de @melioratus, pero tuve problemas con eso, cuando encontré la solución anterior.

@jpkotta thx para señalar la solución necesaria para evitar el problema número-lista-con-código-bloque.

Alex Stragies
fuente
1
Muy inteligente solución! ¡Gracias por publicar!
Melioratus