Mam org-mode
plik zawierający tabelę danych i dwa bloki kodu Pythona, aby wyodrębnić z niej różne podsumowania.
Chciałbym udostępnić niektóre wspólne stałe i funkcje między tymi dwoma blokami kodu. Idealnie zrobiłbym to, dzieląc wspólny kod na osobny blok kodu, który byłby automatycznie uwzględniany i oceniany za każdym razem, gdy oceniany jest jeden z pozostałych dwóch bloków. W gotowej składni wyglądałoby to mniej więcej tak:
#+NAME: init_block
#+BEGIN_SRC python
... common constants and functions here ...
#+END_SRC
#+NAME: summary_1
#+BEGIN_SRC python :prepend init_block
... data-processing code depending on init code goes here ...
#+END_SRC
#+NAME: summary_2
#+BEGIN_SRC python :prepend init_block
... more processing which also depends on init code ...
#+END_SRC
Chyba mógłbym skorzystać z tej :session
opcji, ale wolałbym tego nie robić z dwóch powodów. Po pierwsze, tworzy stanowy system, a nie taki, który działa od zera za każdym razem, gdy używam C-c C-c
bloku kodu. Po drugie, i w związku z tym muszę teraz pamiętać o ręcznej ocenie wspólnego kodu inicjalizacji za każdym razem, gdy otwieram plik: nie mogę po prostu zaktualizować tabeli danych, przejść do jednego z bloków podsumowań i nacisnąć, C-c C-c
aby go zaktualizować.
Czy jest na to dobry sposób?
Po zastanowieniu trochę znalazłem częściowe rozwiązanie tego problemu. Używa
:session
, ale mogę przynajmniej zapewnić, że wspólny kod inicjujący jest zawsze uruchamiany automatycznie przed obliczeniem jednego z pozostałych bloków. „Sztuczka” polega na użyciu fikcyjnej zmiennej nagłówka, która odnosi się do bloku nagłówka, co powoduje, że jest ona oceniana za każdym razem:Teraz mogę zmieniać definicje
init_block
i automatycznie ponownie je oceniać za każdym razem, gdy oceniany jest inny blok, który odwołuje się do niego:var dummy=init_block
. Działa to dobrze, pod warunkiem, że definicje winit_block
są idempotentne i bezpaństwowe.(Zauważ, że przy zmianie bloków Pythona na
:session
tryb musisz usunąć wszelkiereturn
instrukcje, które są potrzebne w trybie funkcjonalnym, aby zwrócić wartość z bloku).źródło