我對lisp非常陌生。我試圖寫一個函數命名X2Y這需要兩個參數x和y這是整數,並返回其從X開始,位於ylisp中的一個函數,名爲xtoy,它返回x到y的列表
(defun xtoy (X Y)
(cond ((> X Y) (list nil))
((= X Y) (list Y)))
(T (append (list X) x2y(+ 1 X) Y)))))
我對lisp非常陌生。我試圖寫一個函數命名X2Y這需要兩個參數x和y這是整數,並返回其從X開始,位於ylisp中的一個函數,名爲xtoy,它返回x到y的列表
(defun xtoy (X Y)
(cond ((> X Y) (list nil))
((= X Y) (list Y)))
(T (append (list X) x2y(+ 1 X) Y)))))
與ABO血型ABO的版本開始,您可以簡化很多:
1)擺脫(= XY)和在(> XY)
(defun xtoy (X Y)
(cond ((> X Y) nil)
(t (append (list X) (xtoy (+ 1 X) Y)))))
更換(名單無)由零
2)簡化cond
到if
語句
(defun xtoy (X Y)
(if (<= X Y)
(append (list X) (xtoy (+ 1 X) Y))
nil))
3)離開了最終nil
,因爲這是當條件不匹配
(defun xtoy (X Y)
(if (<= X Y)
(append (list X) (xtoy (+ 1 X) Y))))
4)使用cons
代替append
(defun xtoy (X Y)
(if (<= X Y)
(cons X (xtoy (+ 1 X) Y))))
在elisp的結束整數列表,您正在尋找章fnumber-sequence
RET。
您在問題中提供的代碼處於非常混亂的狀態。 Emacs可以爲您精選parens。 這是足以讓我沒有任何調試解決您的代碼:
(defun xtoy (X Y)
(cond ((> X Y) (list nil))
((= X Y) (list Y))
(t (append (list X) (xtoy (+ 1 X) Y)))))
這是你如何開啓強調:
(setq show-paren-mode t)
不要最*scratch*
或ielm
您編輯的 - 它們使事情變得更容易。
不,OP只是對調用語法('xtoy(1+ x))'而不是'x2y(1 + x)'有困惑。在我看到的關於SO的問題中,我非常頻繁地看到這種混淆。 –
@ ChrisJester-Young,問題代碼中還有兩個額外的關閉對象。 –
啊,對。採取的點。 –
如果您需要關於您的功能的幫助,我建議您使用cons
而不是list
,並使其從累加器開始。
(defun xtoy (from to &optional acc)
(if (> from to)
acc
(xtoy from (- to 1) (cons to acc))))
有什麼問題什麼隱含回來了? –
該代碼不起作用,我粘貼的問題,但現在解決它 – shunya
@shunya:請不要說elisp和common-lisp是**不同的**語言都在lisp家庭。如果你要問一個問題,請用問題語言標記。 – Baggers