2011-12-03 7 views
1

다음 코드가 작동되기를 바랍니다. 한 단계 변수를 확장하려면 어떻게해야합니까? LISP에서 목록의 변수를 확장하십시오.

(let* ((data1 10) 
     (data2 '(data1 20))) 
    (progn data2)) 

나는 (10 20)을 기대하지만, 사실 나는 (data1 20)을 얻었다. 또한, 저는 다음에서 (10 20 (data2))을 좀하고 싶습니다 :

(let* ((data1 10) 
     (data2 30) 
     (data3 '(data 10 20 '(data2))) 
    (progn data3)) 
+0

PROGN은 어떤 용도로 사용됩니까? –

+0

Lisp의 기초를 배우고 싶다면,이 책을 추천한다. [Common Lisp : Symbolic Computing에 대한 부드러운 소개] (http://www.cs.cmu.edu/~dst/LispBook/). PDF 버전을 여기에서 다운로드 할 수 있습니다. –

답변

2

변수가 확장되지 않는 이유는 당신이 '를 사용하여 전체 목록을 인용 한 것입니다. '은 lisp에서 목록을 만드는 방법이 아니므로 인용 부호로 묶어서 (즉, 평가하지 않도록합니다).

data1과 20이라는 내용이 포함 된 목록을 만들려면 (list data1 20)을 사용하십시오.

1

sepp2k에 따르면 런타임에 목록을 만드는 일반적인 방법은 list 기능입니다. 인용 된 목록은 리터럴 값의 목록 리터럴입니다.

그러나 런타임에 인용 된 목록 인 역 인용 부호와 비슷한 목록을 만드는 또 다른 방법이 있습니다. 당신은 당신이

`(,data1 20) 

당신의 예에 대한 또 다른 한가지으로 원하는 것을 얻을 수있다 : 당신은 거기에 progn들 필요가 없습니다. progn은 여러 표현식을 시퀀싱하고 마지막 표현식의 값을 반환하기위한 것으로, 하나의 값 표현식 인 경우에는 포장을 사용하지 않고 사용할 수 있습니다. 그러나 여러 표현식을 사용하더라도 let*은 암시 적으로 progn을 본문에두기 때문에 progn을 사용할 필요가 없습니다.

관련 문제