아래는 분명히 작동하지 않으므로이 질문입니다.
어떻게 값으로는 너무 아래의 코드를 수정합니까 somelist
된다 '(("abc" . 123))
?
(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))
(add-to-list 'somelist '(,x . ,y))
했지만 역 따옴표를 잊었다.
아래는 분명히 작동하지 않으므로이 질문입니다.
어떻게 값으로는 너무 아래의 코드를 수정합니까 somelist
된다 '(("abc" . 123))
?
(setq x "abc")
(setq y 123)
(setq somelist nil)
(add-to-list 'somelist '(x . y))
(add-to-list 'somelist '(,x . ,y))
했지만 역 따옴표를 잊었다.
답변:
일반적인 문제는 당신이 필요로하는 것입니다 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"))
사용할 요소는 요소로 수행해야 할 작업에 따라 다릅니다.
인용 표현식은 평가되지 않으므로 cons 셀을 인용하지 마십시오. 그것이 바로 평가를 막기 위해 인용하는 이유입니다. 그러나 그것은 당신이 원하는 것이 아니므로 그러지 마십시오.
대신 두 개의 평가 된 값, 즉 인수에서 죄수 셀을 작성하는 양식을 사용하십시오.
(cons x y)
물론 당신은 또한 인용을 할 수 있지만 그것은 실제로 의미가 없으며 더 나빠 보입니다. 만 사용 `
하고 ,
그 가독성을 향상시킬 때, 즉 단점 셀을 구성하거나 일부 기존 목록의 시작 부분에 원자 또는 목록을 추가하는 것보다 더 복잡한 일을 수행 할 때.
준 따옴표를 사용하면 다음과 같습니다.
`(,x . ,y)
이 경우 전혀 필요하지 않은 추가 구문을 사용하고 사용 cons
중인 난독 화 때문에 더 나쁩니다 .
cons
. Quasiquoting은 가독성보다는 목록 내용을 세밀하게 제어하는 데 더 관심이 있지만 유스 케이스가 적합하다는 데 동의합니다 cons
.
cons
, list
등을 nconc
. 더 예쁘다는 것을 제외하고. "목록 내용의 세밀한 제어"가 필요할 때 유용한 "구문 설탕"( "처음에 원자 또는 목록을 추가하는 것보다 더 복잡한 것을 수행"). 그리고 그 구문 설탕을 사용할 때의 추가 이점은 가독성입니다. 준 따옴표는 더 세밀한 제어를 제공하지 않습니다. 초기 시도에서 더 적은 버그로 동일한 작업을 수행 할 수 있습니다. :-)
`(,x . ,y)
.