2011-05-16 7 views
12

파이썬에서 튜플의 값을 변수에 할당하는 것과 비슷한 방법으로 Common Lisp의 심볼 목록에리스트 값을 할당 할 수 있습니까? np 이제 각각 12에 동일튜플을 파이썬과 비슷하지만 일반 Lisp으로 구현하기

(setq '(n p) '(1 2)) 

같은

x, y, z = (1, 2, 3) 

뭔가. 위의 내용은 내가 머리에서 생각하고있는 방법 이었지만 작동하지 않습니다. 나는 다음과 같이 적용하여 시도 :

(apply setq '('(n p) '(1 2))) 

나는 리스프에 새로운, 그래서이 노골적으로 분명 뭔가를하는 경우, 너무 가혹하지 않도록 노력하고 올바른 방향으로 날 가리하시기 바랍니다! 감사.

추신 : 나는 이것을 Scheme과 Common Lisp의 튜플 확장에 대한 게시물을 보았다.하지만 Scheme을 사용하지 않아서 질문 1)에 답하는 데별로 도움이되지 않았다. 2) 가장 높은 순위의 대답은 단어 apply 이었기 때문에.

답변

12

사용 DESTRUCTURING-BIND. 키워드에 의한 지정, 선택적 매개 변수 등. 실제로 함수의 매개 변수 목록으로 할 수있는 모든 것. 당신이 실제로 destructure 할 수있는 목록을 가지고 있고, 한 번에 변수의 무리를 설정하지 않는 경우

하지만, 사용 PSETF :

 
(psetf n 1 
     p 2) 

또한 setf의를 사용할 수 있지만 PSETF이 가까이 아날로그입니다 튜플 할당 : 예를 들어 값을 교환/치환하는 데 사용됩니다.

# Python 
n, p = p, n 
x, y, z = z, x, y 
 
;; Lisp 
(psetf n p 
     p n) 
(psetf x z 
     y x 
     z y) 

사실 당신은 아마 멀리 평범한 LET과 함께 얻을 수 있습니다.

또한 SETQ를 사용하지 마십시오. SETF/PSETF를 사용하면 더 좋으며, 특정 유형의 지정을 수행 할 수있는 유일한 방법이기 때문에 SETF/PSETF를 사용하십시오.

+2

스와핑 및 회전의 경우 'rotatef' :'(rotatef n p)','(rotatef x y z)'가 있습니다. – Svante

9

destructuring-bind과 같은 소리 (아래쪽에 있음)로 원하는 것을 할 수 있습니다.

또한 HyperSpec 설명이지만 다른 링크는 더 잘 보여줄 것이라고 생각합니다. 튜플 풀기보다 더 많은의 전체 지옥을 할 수

(destructuring-bind (x y z) (list 1 2 3) (+ x y z)) 
6

목록이 있고 그 값을 여러 변수에 할당하려는 경우 DESTRUCTURING-BIND가 필요합니다.

그러나 파이썬의 경우 "목록 또는 튜플을 반환하려면 변수 목록 또는 튜플을 사용하여"대소 문자를 할당하십시오. 다중 반환 값과 다중 값 결합을 사용하는 것이 좋습니다.