2009-12-09 2 views
1

배열 사이에 델타를 가져 오는 함수를 만들려고하고 있지만 지금은 하위 집합을 만들고 싶습니다. N 번째 요소를 가져옵니다.Lisp에서 기호 목록이 아닌 배열 목록을 만드는 방법은 무엇입니까?

(defvar p1 #(1 2)) 
(defvar p2 #(3 4)) 
(mapcar '(lambda (x) (aref x 0)) '(p1 p2)) 

debugger invoked on a TYPE-ERROR in ... 
    The value P1 is not of type ARRAY. 

make-array로 만들면 같은 오류가 발생합니다.

람다 함수를 적용하거나 일반적으로 (aref x 0) 또는 (aref x N)을 적용하는 방법은 무엇입니까?

결국 델타를 반환하는 함수를 만들고 싶습니다 : p2 - p1.

+0

이 제목의 제목이 잘못되었습니다. 배열의 요소를 가져 오는 것이 아니라 목록 기호 대신 배열 목록을 만드는 것이 문제입니다. –

답변

3

MAPCAR은 첫 번째 인수로 함수를 취합니다. '(lambda (x) (aref x 0))(quote (lambda (x) (aref x 0)))과 같으며 이것은 이 아니고 함수입니다. (function (lambda (x) (aref x 0)))으로 함수를 만들고 싶다면 #'(lambda (x) (aref x 0))으로 짧게 쓸 수도 있고 심지어 표준 매크로로 인해 (lambda (x) (aref x 0))으로 쓸 수도 있습니다.

'(p1 p2)(quote (p1 p2))과 동일합니다. QUOTE는 인수가 이 아니며이 아니므로 "P1"및 "P2"라는 이름이 해당 값이 아니라 자체를 나타냄을 의미합니다. 형식 오류는 기호 'P1이 배열이 아니며 단지 값으로 배열을가집니다. 값 목록을 얻으려면 LIST : (list p1 p2)을 사용하십시오. 결론적으로

: (mapcar #'(lambda (x) (aref x 0)) (list p1 p2))

편집 : 벡터를 뺀를 들어, MAP 기능을 조사한다 여러 시퀀스를 제공 할 수 있습니다. 당신은, 당신은 SYMBOL-VALUE를 사용하려면

+0

이것은 델타를 얻는 궁극적 인 목표를 제시하지 않고 피상적 인 문제에 응답합니다. – Xach

+0

xach, 나는 마지막 단락에서 힌트를 줬다. – Svante

1

나는 당신의 프로그램에서 실제로이 포함 된 목록에 mapcar 등등을 적용하려고하기 때문에 즉

'(p1 p2) 

대신

(list p1 p2) 

을 가져야한다, 문제는이 목록을 인용했다고 생각 요소, 기호 p1 및 기호 p2로 구성됩니다.

0

antti.huima가 맞습니다.

(mapcar #'(lambda (x) (aref x 0)) (list p1 p2)) 

참고 lambda 앞에있는 작은 따옴표 앞에 해시 마크 : 그러나 코드에서 다른 오류가 있습니다.

-2

:

(defvar p1 #(1 2)) 
(defvar p2 #(3 4)) 
(mapcar #'(lambda (x) (aref (symbol-value x) 0)) '(p1 p2)) 
+2

이것은 전역 값 이외에는 작동하지 않습니다. – Xach

3

는 두 벡터 사이의 차이를 포함하는 델타 벡터를 얻을하려면 다음을 수행하십시오

(map 'vector #'- p2 p1) 

당신의 예에서는 반환 :

#(2 2) 
+0

그것이 내가 암시 한 것입니다. – Svante

+0

나 한테서 한 점 더 가까이 갈 수있어. –

관련 문제