4

mapcar の使用例を示すこのコードがあるとします

(mapcar #'1+ (list 10 20 30)) ; ⇒ (11 21 31)

(mapcar (lambda (it)
          (* 2 it))
        (list 0 1 2 3))
;; ⇒ (0 2 4 6)

(require cl-lib)
(cl-mapcar #'+
           '(1 2 3)
           '(10 20 30))
;; ⇒ (11 22 33)

チュートリアルで使用できるように、または mapcar の仕組みを忘れたときにいつでもコードをすぐに読めるように、そのコードをどこかに書いたままにしているかもしれません。

ここで、コード内のいくつかの例を更新したいとします。たとえば(list 0 1 2 3)、2 番目の例を別のリストに変更する場合があります。例を変更した直後に、対応する結果のコメントが古くなっています。結果のコメントも更新する必要があります。そのため、フォームを評価し、結果をコピーして、コメント内の古い結果を新しい結果に置き換えます。それをすべて簡単に、そして面倒にならないようにするために使用できるパッケージはありますか? これは、単に既存のサンプル コードを更新するだけなので、litable または ielm パッケージが解決する問題とは別の問題です。

今私が使っているのは:

(defun my-insert-eval-last-sexp ()
  (interactive)
  (let ((beg (point)))
    (let ((current-prefix-arg '(4)))
      (call-interactively 'eval-last-sexp))
    (goto-char beg)
    (if (looking-back ")")
        (insert " ; "))
    (insert "⇒ ")
    (move-end-of-line 1)))

古いものを更新するのではなく、結果のコメントを追加するだけであり、フォームが数値に評価されるときに奇妙なものが挿入されるというバグがあるため、これでも十分ではありません。

(+ 1 2)
;; ⇒ 3 (#o3, #x3)
4

2 に答える 2

2

まあ、私はこの種のことを奨励したいのかどうかわかりません;-)、しかし、これはあなたがやろうとしていることに少し近づくでしょう、IIUC:

 (defun my-insert-eval-last-sexp ()
   (interactive)
   (let ((this-command  'eval-print-last-sexp))
     (save-excursion (eval-last-sexp-1 t)))
   (when (looking-back ")") (insert " ; "))
   (insert "⇒ ")
   (move-end-of-line 1))
  1. ポイントを保存してから、明示的にポイントに戻る必要はありません --- を使用しますsave-excursion

  2. プレフィックス arg をバインドして、コマンドを対話的に呼び出す必要はありません。それ(またはそのヘルパー関数)を直接呼び出して、必要な引数を渡すだけです。

  3. これがコマンドの 2 回目の発生であると認識されないように、動作を微調整する必要があります。これにより、8 進数などの数値情報が出力されます。letバインディングはそれを行います (しかし、これは醜い小さなハックです) 。

于 2013-08-17T02:59:29.130 に答える
2

関数が行うそれぞれのことは、org-mode、つまり org-babel で実装されます。

情報、組織モード、14 ソース コードの操作を参照してください。

于 2013-08-17T07:27:53.127 に答える