2010-09-28 129 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