Dalam org-mode
, saya mencoba mendefinisikan fungsi, variabel, dan kemudian menetapkan ke variabel lain hasil dari panggilan fungsi pada variabel pertama. Namun, sepertinya saya tidak bisa menggunakan variabel baru ini dalam panggilan fungsi selanjutnya.
Menggarisbawahi panggilan fungsi tidak berfungsi, tetapi memengaruhi nilai ke variabel terlebih dahulu akan memungkinkan untuk debug lebih cepat jika terjadi kesalahan dalam panggilan fungsi pertama, dan untuk menghindari duplikasi perhitungan yang berpotensi mahal.
MWE: (gunakan (require 'ob-emacs-lisp)
jika perlu)
#+name: square
#+begin_src emacs-lisp :var x=3
(message (format "%s" (* x x)))
#+end_src
#+RESULTS: square
: 9
#+name: value
: 45
#+name: squaredvalue
#+call: square(x=value)
#+RESULTS: squaredvalue
: 2025
Now I try to reuse this value:
#+begin_src emacs-lisp :var res=squaredvalue
(message res)
#+end_src
#+RESULTS:
: nil
Inlined calls do work:
#+begin_src emacs-lisp :var res=square(value)
(message res)
#+end_src
#+RESULTS:
: 2025
Memperluas blok kode kedua menunjukkan:
(let ((res (quote "nil")))
(message res))
Apa yang saya lewatkan?
(Ini telah diuji pada emacs 24.3.1, 24.4 dan 24.5, menggunakan org 8.2.10)
Jawaban:
Tambahkan secara eksplisit di
#+name:
atas#+results:
blok baru.sumber
#+name:
sebelumnya#+call:
, sehingga tidak menambahkan pembukuan ke proses: cukup beri nama hasil alih-alih definisi. Mungkin rasanya tidak sealami mungkin, tetapi setidaknya itu bukan solusi untuk mencari solusi alternatif.-result
tidak menghasilkan apa-apa. Harap tambahkan catatan bahwa penamaan panggilan diperlukan dan bahwa nama hasilnya harus nama panggilan yang diakhiri dengan-result
. Setidaknya itulah yang saya catat. (Jika seseorang lupa menyebutkan panggilan, evaluasi ulang berikutnya akan menambah hasil baru dengan mengabaikan hasil yang ada.-result
hanyalah konvensi penamaan yang saya gunakan untuk contoh ini. Jika Anda secara eksplisit mencari hasil dari blok sumber kemudian tambahkan()
ke nama ketika meneruskan nama sebagai variabel ke blok lain atau di dalam referensi noweb.#+call
itu dinamai. Nama hasilnya dapat dipilih secara sewenang-wenang. Jika panggilan tidak bernama, baris hasil tanpa nama tambahan dihasilkan oleh panggilan.Anda dapat menggunakan
:post
-rutin yang menampilkan hasilnya sebagai:name
. Panggil blok babel Anda dengan pos rutin ini dan masukkan hasilnya ke dalam laci. Dalam contoh berikut rutin posting ini dinamaiasValue
.Cara lain untuk menghindari penghitungan ulang blok kode adalah
:cache
argumen tajuk. Jika ini disetel keyes
blok kode dan argumennya diperiksa untuk perubahan dan jika tidak ada perubahan, hasil sebelumnya digunakan tanpa evaluasi ulang blok kode sumber.sumber
:cache yes
) adalah solusi standar. Hal ini juga dijelaskan dalam manual-org (lihat bagian 14.8.2.16:cache'). It is a pity that it does not smoothly work with
# + panggil. I think this is a bug. The first solution works with
# + panggil` dan juga memiliki keuntungan bahwa itu sepenuhnya memisahkan blok kode. Bahkan jika Anda mengedit blok kode pertama dan mencoba yang kedua blok kode pertama dan coba yang kedua tidak dievaluasi. (Tergantung pada tugas yang mungkin menguntungkan atau tidak disukai. Anda hanya perlu mengingatnya.)Saya menduga Anda hanya perlu meningkatkan mode Org Anda. Ini berfungsi pada saya (versi perkembangan saat ini dari Org) dan secara umum harus bekerja pada tag
release_8.3beta
. Di bawah ini adalah komit yang menurut saya memperbaiki masalah yang Anda gambarkan.Selain memuat Org dari git repo, opsi lain untuk menjalankan versi yang lebih baru adalah menginstal paket ELPA .
sumber
;)
Lebih tepatnya, sayaorg-version
adalah 8.2.10. Saya telah mengedit pertanyaan dengan informasi ini, di mana seharusnya di tempat pertama.