2016-07-09 32 views
-1

以下代码中的语法错误是什么?带循环和条件的Lisp代码中的语法错误

(defun getchoice3() 
    (let ((choice 1)) 
    (format t "~%Enter a number (1-5): ") 
    (loop for choice = (or (parse-integer (prompt-read "Choice: ") :junk-allowed t) 0) do 
     while (and (> choice 0) (< choice 6)) 
     (cond 
      ((= choice 1) (print "1 chosen")) 
      ((= choice 2) (print "2 chosen")) 
      ((= choice 3) (print "3 chosen")) 
      ((= choice 4) (print "4 chosen")) 
      ((= choice 5) (print "5 chosen")) 
      (t (print "invalid entry, exiting.")))) 
      choice)) 

所报告的错误是很一般:

*** - LOOP: illegal syntax near 
     (COND ((= CHOICE 1) (PRINT "1 chosen")) ((= CHOICE 2) (PRINT "2 chosen")) ((= CHOICE 3) (PRINT "3 chosen")) 
     ((= CHOICE 4) (PRINT "4 chosen")) ((= CHOICE 5) (PRINT "5 chosen")) (T (PRINT "0 chosen, exiting."))) 
     in 
     (LOOP FOR CHOICE = (OR (PARSE-INTEGER (PROMPT-READ "Choice: ") :JUNK-ALLOWED T) 0) WHILE (AND (> CHOICE 0) (< CHOICE 6)) 
     (COND ((= CHOICE 1) (PRINT "1 chosen")) ((= CHOICE 2) (PRINT "2 chosen")) ((= CHOICE 3) (PRINT "3 chosen")) 
     ((= CHOICE 4) (PRINT "4 chosen")) ((= CHOICE 5) (PRINT "5 chosen")) (T (PRINT "0 chosen, exiting.")))) 

虽然“做”是存在的代码,它不被报告的错误消息。

+0

为什么不从正确缩进和格式化代码开始?那会更容易找到语法错​​误。 –

+0

这怎么可能?第二个代码行已经没有缩进,但它应该。修理它! –

+0

带有变量选项的最后一行不能正确缩进。修理它。然后问自己:鉴于LOOP的语法,为什么DO在错误的地方,它应该在哪里? –

回答

3

语法错误消失了。你应该尝试你的代码。

我不明白你为什么没有正确缩进代码。如果没有正确的缩进,你将无法编写任何工作代码,特别是不能使用Lisp代码。

您的代码:

(defun getchoice3() 
    (let ((choice 1)) 
    (format t "~%Enter a number (1-5): ") 
    (loop for choice = (or (parse-integer (prompt-read "Choice: ") :junk-allowed t) 0) 
     while (and (> choice 0) (< choice 6)) do 
     (cond 
      ((= choice 1) (print "1 chosen")) 
      ((= choice 2) (print "2 chosen")) 
      ((= choice 3) (print "3 chosen")) 
      ((= choice 4) (print "4 chosen")) 
      ((= choice 5) (print "5 chosen")) 
      (t (print "invalid entry, exiting.")))) 
     choice)) ; <- WHY THIS INDENTATION? 

的代码格式正确的模样更是这样的(没有格式化一个单一的一种方式,但缺口始终是相同的方式):

(defun getchoice3() 
    (let ((choice 1)) 
    (format t "~%Enter a number (1-5): ") 
    (loop for choice = (or (parse-integer (prompt-read "Choice: ") 
              :junk-allowed t) 
          0) 
      while (and (> choice 0) 
        (< choice 6)) 
      do (cond 
       ((= choice 1) (print "1 chosen")) 
       ((= choice 2) (print "2 chosen")) 
       ((= choice 3) (print "3 chosen")) 
       ((= choice 4) (print "4 chosen")) 
       ((= choice 5) (print "5 chosen")) 
       (t (print "invalid entry, exiting.")))) 
    choice)) 

你在最后一行看到不同的例子吗?我的版本正确缩进。

为什么这很重要?它可以帮助您了解您的功能将始终返回1。独立于任何输入,该功能将始终返回1。缩进可以帮助你理解什么属于什么,给定一定的范围。

这是不正确的缩进。

(let ((a 1)) 
    (loop for a from 1 to 10) 
     a) ; <- where does this a belong to??? 
      ; this indentation indicates that A belongs to the LOOP 
      ; which it doesn't 

正确的缩进:

(let ((a 1)) 
    (loop for a from 1 to 10) 
    a)  ; here it's clear to see that A was introduced by the LET construct 

所以,不要缩进代码这样的方式你如何梦想很有道理。 使用编辑器命令正确执行此操作。然后你可以更好地发现代码中的问题。

Lisp代码可以以任意方式进行格式化和缩进,因为它使用了与缩进无关的数据结构:s表达式。

Lisp的不在乎:

(+ a b c) 

(+ 
a    b 
     c) 

 (+ 
a 
     b 

c) 

它是Lisp的都是一样的。

但不适合人类。以上只有一个版本可供人类阅读。

如果你不努力缩进和格式化你的代码,为什么任何人都应该努力回答你的问题,这些问题到目前为止都是由简单的语法错误引起的。

+0

是的,它现在有效。谢谢。你怎么看这种格式:http://sandbox.mc.edu/~bennet/cs231/examples/loops.html – rnso

+0

@rnso可怕。不要使用它。 – jkiiski