2010-05-11 59 views
1

是否有一種簡單的方法來定義一個函數,當傳遞參數時重複它自己?如何定義一個在傳遞參數時重複自己的函數

舉例來說,我已經定義了以下功能

(defun swap-sign() 
    (interactive) 
    (search-forward-regexp "[+-]") 
    (if (equal (match-string 0) "-") 
     (replace-match "+") 
    (replace-match "-")) 
) 

我想C-u swap-sign調用swap-sign四倍。

我已經試過

(defun swap-sign (&optional num) 
    (interactive) 
    (let ((counter 0) 
(num (if num (string-to-number num) 0))) 
    (while (<= counter num) 
     (search-forward-regexp "[+-]") 
     (if (equal (match-string 0) "-") 
    (replace-match "+") 
(replace-match "-"))   
     (setq counter (1+ counter))))) 

C-u swap-sign仍只運行交換號(或者更精確地說,while循環體)一次。我猜測這是因爲if num不是測試num是否爲空字符串的正確方法。

我在正確的軌道上,還是有更好/更簡單的方式來延長swap-sign

+0

這只是爲了改變標誌。難道你不會只是確定這個數字是否是奇數並且改變一次? – corn3lius 2010-05-11 14:11:43

+0

每次調用'swap-sign'都會使光標指向匹配後的第一個字符。所以四次調用應該交換四個標誌。我把它叫做'1231.196 + 760.489 + 213.553 + 122.165-24.633'這樣的字符串。 – unutbu 2010-05-11 14:20:20

回答

5
(defun swap-sign (arg) 
    (interactive "p") 
    (dotimes (i arg) 
    (search-forward-regexp "[+-]") 
    (if (equal (match-string 0) "-") 
     (replace-match "+") 
     (replace-match "-")))) 

interactive特殊形式的文檔瞭解更多信息: C-H˚FinteractiveRET

+0

美麗。非常感謝。 – unutbu 2010-05-11 15:24:58

4

您需要通過添加「p」作爲交互參數規範(M-x apropos interactive以獲取文檔)來告訴emacs期望並傳入參數。在這裏,我已經對代碼做了最小的改動,以使它能夠正常工作 - 但是請注意,您不需要let/while來進行迭代,並且arg不需要是可選的。

(defun swap-sign (&optional num) 
    (interactive "p") 
    (let ((counter 1)) 
    (while (<= counter num) 
     (search-forward-regexp "[+-]") 
     (if (equal (match-string 0) "-") 
     (replace-match "+") 
    (replace-match "-"))   
     (setq counter (1+ counter))))) 

請注意,您不需要從字符串轉換參數 - 使用「p」可告訴emacs爲您執行此操作。

+0

感謝您向我展示如何以最少的更改修復代碼。 – unutbu 2010-05-11 15:26:49

+1

謝謝。 @懷遠的解決方案比我的要乾淨得多...... – 2010-05-11 15:53:47

相關問題