2017-09-14 9 views
0

접두어로 중위 입력을 변경하는 함수를 만들려고합니다 : (x + 1) 입력은 (+ x 1)으로 출력됩니다. Lisp, defun에서 작동하지 않는 명령어

(setq x '(Y + 1)) 
(if (listp x) (list (second x) (first x) (first (last x))) x) 

은 그래서 (+ Y 1)을 반환 I 입력 목록과이 목록 아니라면 사용자가 입력 한 경우 :

그래서 여기 순간 내 코드입니다. 그러나

는 문제는 함수에서 작업이 코드를 얻을 수 있다는 것입니다 :

(defun prefixToInfix (x)(
    (if (listp x) (list (second x) (first x) (first (last x))) x) 
    ) 
) 
함수가 실제로 만들어

하지만 난 그것을 호출 할 때

(prefixtoinfix '(Y + 1)) 

오류가 발생합니다

Error: Illegal function object: (IF (LISTP X) (LIST # # #) X). 
[condition type: TYPE-ERROR] 

내 if 문이 주 프로그램에서 작동하지만 왜 내 if 문에서 실행하는지 알지 못합니다. 기능.

+2

함수 본문 주위에 여분의 괄호가 있습니다. – jkiiski

+0

무엇을 의미합니까? 그것을 고칠 수 있습니까? –

+1

첫 줄'(x) ('->'(x)')과 ​​마지막 닫는 괄호의 끝에서 괄호를여십시오. – jkiiski

답변

4

누락 된 부분은 Lisp 괄호의 의미는 입니다. 의미는입니다. C/자바/파이썬 & C에서

, 다음 표현식은 동일합니다

리스프에서
a+b 
(a+b) 
(a)+(b) 
(((a)+(b))) 
(((((a)+(b))))) 

는, 다음과 같은 표현이 매우 다르다 :

  • a --- 상징
  • (a) --- 기호 인 단일 요소가있는 목록 a
  • (1 (2)) --- 두 가지 요소의 목록 : 길이 1의 1
  • 목록
    1. 수를 포함하는 수 2
  • 귀하의 경우, 기능 (참고 들여 쓰기 및 괄호의 위치에서

!)

(defun prefixToInfix (x) 
    ((if (listp x) (list (second x) (first x) (first (last x))) x))) 

주위 if를 추가 괄호를 갖는다 (그리고 이는도 ë 원인 전자 if 형태) 최악의 결과로, 함수로 해석하고, (주의 줄 바꿈 및 들여 쓰기를해야한다 - lispers은

(defun prefix-to-infix (x) 
    (if (listp x) 
     (list (second x) 
      (first x) 
      (first (last x))) 
     x)) 

) http://lisp-lang.org/style-guide/를 참조하십시오, 그들은 코드를 이해하기 위해 들여 쓰기를 보면, 괄호를 포함되지 않습니다 추신. want to learn common lisp의 권장 사항도 참조하십시오.