변수를 목록에 추가하기 전에 평가하는 방법은 무엇입니까?


30

아래는 분명히 작동하지 않으므로이 질문입니다.

어떻게 값으로는 너무 아래의 코드를 수정합니까 somelist된다 '(("abc" . 123))?

(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))

5
준 따옴표를 사용해 보셨습니까? 시도하십시오 `(,x . ,y).
Dan

아, 그것이 내가 놓친 것입니다. 나는 구글을 위해 무엇을 해야할지 몰랐다 :). 나는 시도 (add-to-list 'somelist '(,x . ,y))했지만 역 따옴표를 잊었다.
Kaushal Modi

이 질문의 복제본으로 간주되는 질문은 자주 반복됩니다. 이 질문 / 답장이 찾고있는 것임을 초보자에게보다 명확하게 알려주는 방법이 있습니까? 문제의 일부는 문제의 근본 원인을 이미 알고있는 경우에만이 질문의 제목이 의미가 있다고 생각합니다 (예 : 답변을 알고 있음). 변수를 평가할 필요가 없다는 것을 알지 못하고 "인용"이 무엇을 의미하는지 잘 모르는 사용자로 자신을 상상하려고하지만 비어 있습니다. @ 드류?
Stefan

@ stefan : 오류 메시지 (커뮤니티 Q + A의 질문 제목에 사용할 수 있음)가있는 경우와 달리 평가 해야하는 것을 인용하여 발생하는 오류 (있는 경우) 그 경우)는 인용 장소에서 멀리 떨어져있을 수 있습니다. 더 일반적으로 (Emacs) 오류는 없습니다. 사용자가 원하는 것과 일치하지 않는 동작 일뿐입니다.
Drew

@ 스테판 : 좋은 질문 제목이 생각 나지 않습니다. 그러나 우리는 적어도 인용 부호를 제거해야하는 "정상"사례와 준 따옴표를 요구하는 사례를 포함하여 직접 문제를 다루는 질문을 공식화 할 수있었습니다. 그러한 경우를 다루는 좋은 Q와 그러한 경우를 다루는 좋은 답변이 도움이 될 것입니다. 그러나 중복 된 Q를 찾으려면 Q 제목에 오류 메시지가 없으면 전체 질문을 읽고 중복 된 부분을 찾는 방법을 알아야합니다.
Drew

답변:


30

일반적인 문제는 당신이 필요로하는 것입니다 x그리고 y그들이에 삽입하기 전에 평가되어야한다 somelist. 와 문제 (와 인용 목록 '으로 리더 구문)quote인수를 평가하지 않는 특수한 형태입니다. docstring에 따르면 :

(quote ARG)

평가하지 않고 인수를 반환하십시오. (quote x)수율 x. 경고 : quote반환 값을 구성하지 않고 Lisp 판독기에 의해 사전 구성된 값만 반환합니다.

따라서 인수를 평가하는 함수 를 역 따옴표 거나 사용해야합니다.

역 따옴표를 사용하면 다음 ,구문 을 사용하여 역 따옴표로 묶은 목록의 요소를 선택적으로 평가할 수 있습니다 .

(setq x "x-val" y "y-val" z "z-val" somelist nil)
'(x  y z)                            ; => (x y z)
`(x ,y z)                            ; => (x "y-val" z)
(add-to-list 'somelist `(x y ,z))    ; => ((x y "z-val"))

또는 cons@tarsius가 그의 대답에서 제안한대로 또는 임의의 수의 요소에 대해 다음을 사용할 수 있습니다 list.

(add-to-list 'somelist (cons x y))   ; => (("x-val" . "y-val"))
(setq somelist nil)                  ; reset
(add-to-list 'somelist (list x y z)) ; => (("x-val" "y-val" "z-val"))

사용할 요소는 요소로 수행해야 할 작업에 따라 다릅니다.


19

인용 표현식은 평가되지 않으므로 cons 셀을 인용하지 마십시오. 그것이 바로 평가를 막기 위해 인용하는 이유입니다. 그러나 그것은 당신이 원하는 것이 아니므로 그러지 마십시오.

대신 두 개의 평가 된 값, 즉 인수에서 죄수 셀을 작성하는 양식을 사용하십시오.

(cons x y)

물론 당신은 또한 인용을 할 수 있지만 그것은 실제로 의미가 없으며 더 나빠 보입니다. 만 사용 `하고 ,그 가독성을 향상시킬 때, 즉 단점 셀을 구성하거나 일부 기존 목록의 시작 부분에 원자 또는 목록을 추가하는 것보다 더 복잡한 일을 수행 할 때.

준 따옴표를 사용하면 다음과 같습니다.

`(,x . ,y)

이 경우 전혀 필요하지 않은 추가 구문을 사용하고 사용 cons중인 난독 화 때문에 더 나쁩니다 .


3
에 좋은 지적 cons. Quasiquoting은 가독성보다는 목록 내용을 세밀하게 제어하는 ​​데 더 관심이 있지만 유스 케이스가 적합하다는 데 동의합니다 cons.
Dan

답변 주셔서 감사합니다. 그것은 저에게 큰 TIL 순간이었습니다. 나는 목록과 단점 앞에 맹목적으로 인용했다.
Kaushal Modi

@ 댄, 그래-아니. 그냥 함께 할 수 없다는 아무것도 할 수없는 Quasiquoting cons, list등을 nconc. 더 예쁘다는 것을 제외하고. "목록 내용의 세밀한 제어"가 필요할 때 유용한 "구문 설탕"( "처음에 원자 또는 목록을 추가하는 것보다 더 복잡한 것을 수행"). 그리고 그 구문 설탕을 사용할 때의 추가 이점은 가독성입니다. 준 따옴표는 더 세밀한 제어를 제공하지 않습니다. 초기 시도에서 더 적은 버그로 동일한 작업을 수행 할 수 있습니다. :-)
tarsius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.