Saya memiliki org-mode
file yang berisi tabel data dan dua blok kode Python untuk mengekstrak ringkasan berbeda darinya.
Saya ingin berbagi beberapa konstanta umum dan fungsi antara dua blok kode ini. Idealnya, saya akan melakukan ini dengan memasukkan kode umum ke dalam blok kode yang terpisah, yang akan secara otomatis dimasukkan dan dievaluasi setiap kali salah satu dari dua blok lainnya dievaluasi. Dalam sintaksis yang dibuat, itu akan terlihat seperti berikut:
#+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
Saya kira saya bisa menggunakan :session
opsi ini, tetapi saya lebih memilih untuk tidak melakukannya, karena dua alasan. Pertama, ini membuat sistem stateful, bukan yang berjalan dari awal setiap kali saya gunakan C-c C-c
pada blok kode. Kedua, dan terkait, saya sekarang harus ingat untuk secara manual mengevaluasi kode inisialisasi umum setiap kali saya membuka file: Saya tidak bisa hanya memperbarui tabel data, pergi ke salah satu blok ringkasan dan tekan C-c C-c
untuk memperbaruinya.
Apakah ada cara yang baik untuk melakukan ini?
Setelah berpikir sedikit lagi saya menemukan solusi parsial untuk masalah ini. Itu memang digunakan
:session
, tetapi setidaknya saya dapat memastikan bahwa kode inisialisasi umum selalu dijalankan secara otomatis sebelum mengevaluasi salah satu blok lainnya. 'Trik' ini adalah dengan menggunakan variabel header dummy yang merujuk ke blok header, sehingga harus dievaluasi setiap kali:Sekarang saya dapat mengubah definisi
init_block
dan meminta mereka secara otomatis dievaluasi ulang setiap kali blok lain yang merujuk padanya menggunakan:var dummy=init_block
dievaluasi. Ini berfungsi dengan baik asalkan definisi diinit_block
idempoten dan stateless.(Perhatikan bahwa saat mengubah blok Python ke
:session
mode, Anda harus menghapusreturn
pernyataan apa pun , yang diperlukan dalam mode fungsional untuk mengembalikan nilai dari blok).sumber