2010-09-28 48 views
1
(defun returnFirstCharacter(p) 

(if (symbolp p) (char (symbol-name p) 0) nil) 
) 

(defun returnRestCharacters (p) 
(let() 
    (intern (subseq(string p) 1)) 
)   
) 

(defun val (x a) 
    (cond ((null a) nil) 
     ((equal (car(cdr a)) x) (cdr (cdar a))) 
     (t (val x (cdr a))) 
    ) 
) 



(defun match (pattern data) 
(cond 
    ((equal pattern data) t) 
    ((match2 pattern data nil)) 
    (t nil) 
) 
) 

    (defun match2 (p d a) 
(cond 

    ((null p)(cond 
        ((null a) t) 
        (t a) 
       ) 
    ) 

    ((numberp p) (cond 
         ((equal p d) t) 
         (t nil) 
        ) 
    ) 

    ( (symbolp p) (cond 
         ((alpha-char-p (returnFirstCharacter p)) 
            (let()(if (equal p d) (match2 nil nil a) nil))) 
         ((equal (returnFirstCharacter p) #\=) 
            (let() 
              (if (and (returnRestCharacters p) (null (val (returnRestCharacters p) a))) 
               (match2 nil nil (cons (
                       list = (returnRestCharacters p) d) a) 
               ) 
               (let() 
                (if (and (returnRestCharacters p) (equal (val (returnRestCharacters p) a) (car d))) 
                 (match2 (cdr p) (cdr d) a) nil) 
               ) 
              ) 
            ) 
         ) 
        ) 
    ) 
    ( (listp p) 
        (cond 
         ((equal (list-length p) (list-length d)) 
          (let() 
          ( if (equal p d) 
            (match2 nil nil a) 
            (let() 
             (append (match2 (car p) (car d) a)(match2 (cdr p) (cdr d) a)) 
            ) 


          ) 
          ) 
         ) 
        ) 
    ) 

) 
) 

我有match2被自己調用兩次。我希望遞歸調用發生。在match2的調用返回true或nil的時候 程序終止 我希望把控制權傳回給之前調用它的match2。如何從lisp函數返回控件

正如你所看到的,我已經兩次調用了match2。 (listp p)match2中的條件我需要做遞歸。怎麼做

+6

我會建議先閱讀一下Lisp的基本介紹。如果沒有學習一些基礎知識,編程Lisp可能不會成功。這本書作爲一個基本的介紹是有用的:http://www.cs.cmu.edu/~dst/LispBook/book.pdf – 2010-09-28 05:16:55

+2

它也不清楚以上是什麼,它應該做什麼。想象一下,發佈隨機奇怪格式化的Java代碼片段並向人們尋求幫助。 Lisp也不是關於「控制流」,而是關於計算價值的更多。這將在基本的Lisp介紹中介紹,參見上文。 – 2010-09-28 05:19:27

回答

1

這看起來像是COND塊的一部分。考慮到這一假設,我添加了COND並重新格式化了代碼,使其更加明顯。

(cond ((alpha-char-p (returnFirstCharacter p)) 
     (let() (if (equal p d) (match2 nil nil a) nil))) 
     ((equal (returnFirstCharacter p) #\=) 
     (let() 
     (if (and (returnRestCharacters p) 
        (null (val (returnRestCharacters p) a))) 
      (match2 nil nil (cons (list '= (returnRestCharacters p) d) a)) 
      (let() 
       (if (and (returnRestCharacters p) 
         (equal (val (returnRestCharacters p) a) 
           (car d))) 
        (match2 (cdr p) (cdr d) a) nil)))))) 

首先,你從尾部位置調用MATCH2,所以你不明白「將控制權交還給前一個match2」是什麼意思。一旦發生了對MATCH2的調用,按照寫法,返回值將簡單地在調用鏈中傳播,因爲您沒有對返回值做任何事情。其次,你沒有明顯的原因使用空LET塊(如果條件爲真,則第一個IF調用MATCH2,否則滑入下一個IF)。在任何情況下,你都不需要評估多個表達式,所以你可以跳過LET塊。此外,使用PROGN比使用空LET塊更傳統一點(對編譯器無關緊要,但對人類讀者來說卻很重要)。

如果你用MATCH2的整個函數定義替換上面的代碼段,並且增加了你認爲它應該做的事情的「純英文」描述,這可能會有所幫助。

編輯:隨着整個代碼發佈(與殘暴的格式),有一個概念,有內MATCH2只有一例「回報,做一些事情」,這就是兩個電話是參數追加吧最後。至少有一段代碼可能會導致運行時錯誤(並且絕對是編譯時警告),其中=用作變量(除非其他地方有動態插入,可能應該是'=)。

你還沒有解釋代碼應該做什麼。如果你坐下來寫下你期望的代碼,那麼你可以一步一步地寫出你錯誤的位置。

+0

請參閱編輯後的版本。我添加了完整的代碼,我知道我需要了解Lisp,但是分配截止日期爲2天,這非常困難。讚賞您的幫助 – gizgok 2010-09-28 17:57:42