2011-09-30 4 views
7

나는 큰 따옴표 안에 vaild CL 표현식을 반환하는 데이터베이스를 가지고 있습니다.문자열로 포함 된 표현식 평가

이 문자열을 표현식으로 변환 할 수 있습니까?

예를 들어, 나는 CLSQL를 통해이 DB에서 쿼리를하고 그 결과로 저를 반환

"(foo a b)"

나는이 표현을 변환하는 방법 :

(foo a b)

그것을 더 평가 하는가?

답변

11
> (read-from-string "(foo a b)") 
(FOO A B) ; 
9 

9read-from-string 제조 여러 값의 초이고; 그것을 무시할 수 있습니다 :

(eval (read-from-string "(foo a b)")) 

적절한 정의를 원하는대로 할 수 있습니다.

+0

감사합니다. 어떻게 그 기능을 찾을 수 없습니까? – oakenshield1

1
* (read-from-string "(+ 1 2)") 

(+ 1 2) 
7 

보안 문제가 있습니다. 변수 *read-eval*을 참조하십시오.

* (read-from-string "#.(+ 1 2)") 

3 
9 

당신은 정말 읽기 코드를 평가하지 않도록 *read-eval*NIL 있는지 확인해야합니다.

* (let ((*read-eval* nil)) (read-from-string "#.(+ 1 2)")) 

debugger invoked on a SB-INT:SIMPLE-READER-ERROR: 
    can't read #. while *READ-EVAL* is NIL 

는 또한 데이터베이스에서 임의의 입력에 EVAL를 호출하는 것은 좋은 생각이 아니다.

일반적으로 코드가 허용 된 기능 만 호출하는지 확인하고자합니다.

관련 문제