2014-01-27 10 views
3

의 기호 평등 다음 함수 : REPL에서CL의 웹 응용 프로그램

(defun check-for-arrow (x) 
    (format t "**~s**~s**~s**~s**" 
      (length (string x)) 
      x 
      (eq x '->) 
      (and (eq (elt (string x) 0) #\-) 
       (eq (elt (string x) 1) #\>))) ; for debug 
    (eq x '->)) 

을 불러와 :

(check-for-arrow '->) 

인쇄, 추적과 :

0> Calling (CHECK-FOR-ARROW ->) 
**2**->**T**T** 
<0 CHECK-FOR-ARROW returned T 

대신에, Hunchentoot 웹 응용 프로그램 내에서 호출 될 때 양식에서 읽은 데이터를 '->'기호를 통해 호출하면 다음과 같이 인쇄됩니다.

0> Calling (NORMALIZER::CHECK-FOR-ARROW ->) 
**2**->**NIL**T** 
<0 NORMALIZER::CHECK-FOR-ARROW returned NIL 

Lisp는 Clozure Common Lisp입니다.

다른 방법으로 기호를 사용할 수 있습니까? 심볼에 'eq'를 사용하거나 문자열에서 화살표를 변환하고 문자열이 동일한 지 확인해야합니까?

감사합니다.

+0

주 : '->'와 같은 것은 기호와 원자입니다. 원자라는 단어는 단지 기호와 다른 의미를 지닙니다. 단점이 아닌 모든 것은 원자입니다. 따라서 숫자 '3', 문자열' "foo"', 벡터'# (1 2 3)', ...은 모두 원자이지만 - 기호가 아닙니다. –

답변

6

Common Lisp에 패키지가 있습니다. 패키지는 심볼의 네임 스페이스입니다.

따라서 "->"라는 다양한 기호를 가질 수 있으며 각 기호는 다른 패키지에 있습니다.

따라서 normalizer::->은 반드시 EQ에서 cl-user::-> 일 필요는 없습니다.

심볼을 패키지에 포함 할 수 없으므로 동일한 이름과 패키지가없는 많은 심볼이있을 수 있습니다.

CL-USER 2 > '#:-> 
#:-> 

CL-USER 3 > (describe *) 

#:-> is a SYMBOL 
NAME   "->" 
VALUE   #<unbound value> 
FUNCTION  #<unbound function> 
PLIST   NIL 
PACKAGE  NIL 

CL-USER 4 > '-> 
-> 

CL-USER 5 > (describe *) 

-> is a SYMBOL 
NAME   "->" 
VALUE   #<unbound value> 
FUNCTION  #<unbound function> 
PLIST   NIL 

일반적인 문제 :

하나는 특정 기호 FOO 뭔가의 EQ를 테스트하는 기능을 가지고있다. 사용자가 FOO을 입력합니다.

그러나 Lisp 함수는 사용자 입력을 기호로 어떻게 변환합니까? 어떤 패키지에 기호가 있을까요? 기호는 이름과 패키지가 다릅니다. 패키지를 지정하지 않으면 기본값은 변수 CL:*PACKAGE*의 값입니다. 그러나이 변수는 다른 시간에 다른 값을 가질 수 있습니다.

테스트 기능을 확장하여 심볼 패키지를 인쇄하면 그 차이가 나타납니다.

CL-USER 7 > (package-name (symbol-package '->)) 
"COMMON-LISP-USER" 
+0

대단히 고마워, 나는이 설명이 필요했다! 웹 응용 프로그램의 '-> 패키지는 "COMMON-LISP-USER"이고, "-> 함수는"NORMALIZER "패키지라는 것을 알 수 있습니다. 그런데 심볼의 "이름"부분 만 확인하는 간단한 방법이 있습니까? – Renzo

+0

이전 질문에 답하기 위해이 테스트를 수행하는 "최상의"방법은'(string = (symbol-name x) (symbol-name '->))'이라고 가정합니다. – Renzo

+1

@renzo :'symbol-name'보다 더 짧은 함수는'string'입니다. –