W org-mode
próbuję zdefiniować funkcję, zmienna, a następnie przypisanie innej zmiennej wynik wywołania funkcji o zmiennej pierwszy. Wydaje się jednak, że nie mogę użyć tej nowej zmiennej w kolejnych wywołaniach funkcji.
Wstawianie wywołań funkcji działa, ale najpierw wpływanie na wartość zmiennej umożliwi szybsze debugowanie w przypadku, gdy coś pójdzie nie tak w pierwszym wywołaniu funkcji, i uniknie powielania potencjalnie kosztownych obliczeń.
MWE: (użyj w (require 'ob-emacs-lisp)
razie potrzeby)
#+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
Rozwinięcie drugiego bloku kodu pokazuje:
(let ((res (quote "nil")))
(message res))
czego mi brakuje?
(Zostało to przetestowane na emacs 24.3.1, 24.4 i 24.5, przy użyciu org 8.2.10)
Odpowiedzi:
Jawnie dodaj nowy
#+name:
powyżej#+results:
bloku.źródło
#+name:
poprzedzania#+call:
wiersza, więc nie dodaje on żadnej księgowości do procesu: wystarczy nazwać wyniki zamiast definicji. Może to nie wydaje się tak naturalne, jak mogłoby, ale przynajmniej nie jest to obejście błagające o alternatywne rozwiązanie.-result
Organizacji nie zwraca żadnych wyników. Dodaj notatkę, że nazywanie połączenia jest wymagane, a nazwa wyniku musi być nazwą połączenia z przyrostkiem-result
. Przynajmniej tak zauważyłem. (Jeśli nie uda się nazwać połączenia, następna ponowna ocena doda nowy wynik, ignorując istniejący nazwany wynik.-result
to tylko konwencja nazewnictwa, której użyłem w tym przykładzie. Jeśli wprost szukasz wyników bloku źródłowego, dodaj()
go do nazwy, przekazując nazwę jako zmienną do innego bloku lub wewnątrz odwołania do nowegob.#+call
jest nazwa. Nazwę wyniku można wybrać dowolnie. Jeśli połączenie nie zostanie nazwane, wówczas wywołanie generuje dodatkową nienazwaną linię wyniku.Możesz użyć
:post
-routine, która wyświetla wynik jako:name
. Zadzwoń do swojego bloku babel przy pomocy tej procedury postu i umieść wynik w szufladzie. W poniższym przykładzie procedura ta została nazwanaasValue
.Innym sposobem uniknięcia ponownego obliczania bloków kodu jest
:cache
argument nagłówka. Jeśli jest ustawiony nayes
blok kodu, a jego argumenty są sprawdzane pod kątem zmian, a jeśli nie ma zmian, poprzedni wynik jest używany bez ponownej oceny bloku kodu źródłowego.źródło
:cache yes
) jest rozwiązaniem standardowym. Jest to również opisane w podręczniku organizacji (patrz rozdział 14.8.2.16:cache'). It is a pity that it does not smoothly work with
# + call. I think this is a bug. The first solution works with
# + call`, a także ma tę zaletę, że całkowicie oddziela bloki kodu. Nawet jeśli edytujesz pierwszy blok kodu i wypróbujesz drugi z nich, pierwszy nie jest oceniany (w zależności od zadania, które może być zaletą lub wadą. Musisz o tym pamiętać).Podejrzewam, że musisz tylko zaktualizować swój tryb Org. Działa to na moim końcu (obecna wersja rozwojowa Org) i ogólnie powinno działać od tagu
release_8.3beta
. Poniżej znajduje się zatwierdzenie, które moim zdaniem rozwiązuje problem, który opisujesz.Oprócz ładowania Orga z repozytorium git, inną opcją do uruchomienia nowszej wersji jest instalacja pakietu ELPA .
źródło
;)
Mówiącorg-version
ściślej , moja to 8.2.10. Zredagowałem pytanie z tą informacją, gdzie powinno być na pierwszym miejscu.