2013-10-22 15 views
-2

我對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))))) 
+3

有什麼問題什麼隱含回來了? –

+0

該代碼不起作用,我粘貼的問題,但現在解決它 – shunya

+1

@shunya:請不要說elisp和common-lisp是**不同的**語言都在lisp家庭。如果你要問一個問題,請用問題語言標記。 – Baggers

回答

2

與ABO血型ABO的版本開始,您可以簡化很多:

1)擺脫(= XY)和在(> XY)

(defun xtoy (X Y) 
    (cond ((> X Y) nil) 
     (t (append (list X) (xtoy (+ 1 X) Y))))) 
更換(名單無)由零

2)簡化condif語句

(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)))) 
+0

什麼是錯誤的(我從x到i的循環收集我)? – Baggers

+1

啊我看到這個問題上有一個elisp和common lisp標籤,blimey – Baggers

3

在elisp的結束整數列表,您正在尋找fnumber-sequenceRET

2

您在問題中提供的代碼處於非常混亂的狀態。 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您編輯的 - 它們使事情變得更容易。

+0

不,OP只是對調用語法('xtoy(1+ x))'而不是'x2y(1 + x)'有困惑。在我看到的關於SO的問題中,我非常頻繁地看到這種混淆。 –

+0

@ ChrisJester-Young,問題代碼中還有兩個額外的關閉對象。 –

+0

啊,對。採取的點。 –

1

如果您需要關於您的功能的幫助,我建議您使用cons而不是list,並使其從累加器開始。

(defun xtoy (from to &optional acc) 
    (if (> from to) 
     acc 
     (xtoy from (- to 1) (cons to acc)))) 
相關問題