2016-07-09 2 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

변수 choice가있는 마지막 행은 정확하게 들여 쓰기 될 수 없습니다. 그것을 고쳐라. 그런 다음 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- 표현식을 사용하기 때문에 임의의 방식으로 형식을 지정하고 들여 쓸 수 있습니다.

리스프는 상관하지 않는다 :

(+ a b c) 

또는

(+ 
a    b 
     c) 

또는

 (+ 
a 
     b 

c) 

그것은 리스프에 대한 모든 동일합니다.

하지만 인간은 아닙니다. 위에 나온 버전 중 한 가지 버전 만 사람이 읽을 때 유용합니다.

코드를 들여 쓰고 서식을 지정하지 않은 경우 사용자가 질문에 대답하려고 노력하는 이유는 무엇입니까? 이는 모두 간단한 구문 오류로 인해 발생합니다.

+0

예, 작동합니다. 감사. 이 형식의 서식에 대해 어떻게 생각하십니까? http://sandbox.mc.edu/~bennet/cs231/examples/loops.html – rnso

+0

@rnso Horrible. 사용하지 마십시오. – jkiiski