2017-12-10 2 views
1

C 코드의 다음 스 니펫을 고려하십시오. M 의 실제 값과 arr의 실제 값은 실제로 중요하지 않습니다. Common Lisp에서 'loop` 매크로로 종속 루프 변수를 사용하는 방법

int arr[M] = {...}; 

for (int i=0; i<M; ++i) { 
    for (int j=i+1; j<M; ++j) { 
     /* do something */ 
    } 
} 

은 무엇 매크로 loop를 사용하여 (관용적하고 효율적인) CL의 아날로그 것 (또는 경우 loop 오른쪽 도구, 다른 구조되지 않습니다)?

나는 배열 액세스와 목록 액세스를 비교하는 것이 정확하지 않지만 더 나은 예를 생각해 낼 수 없다는 것을 알고있다. 내가 시도

하나의 가능성은 다음과 같다 :

(defvar l '(1 2 ...)) 

(loop :for n :on l :do 
    (loop :for x :in (cdr n) :do 
     ;; do something 
    )) 

을하지만 이것은 오히려 거추장스러운 것 같다.

기타 유사한 questions은 목록이없는 범위를 처리합니다.

답변

2

당신이 실제로 계산하고 싶은 것이 확실하지 않지만 그것이 clunky하다고 생각하지 않습니다.

예 :

CL-USER 6 > (loop for (head . tail) on '(1 2 3 4) 
        do (loop for item in tail 
          do (print (list head item)))) 

(1 2) 
(1 3) 
(1 4) 
(2 3) 
(2 4) 
(3 4) 
NIL 

당신은 몇 가지 테스트를 기반으로 쌍을 유지하려면

:

CL-USER 36 > (defun mapcan-pairs (fn list) 
       (loop for (head . tail) on list 
        nconc (loop for item in tail 
           nconc (funcall fn head item)))) 
MAPCAN-PAIRS 

CL-USER 37 > (defun keep-pairs (test list) 
       (mapcan-pairs (lambda (a b) 
           (when (funcall test a b) 
           (list (cons a b)))) 
          list)) 
KEEP-PAIRS 

CL-USER 38 > (keep-pairs (lambda (a b) 
          (= 13 (+ a b))) 
          '(1 2 3 7 1 4 5 6 3 5 10 15 3)) 
((3 . 10) (7 . 6) (3 . 10) (10 . 3)) 
+0

글쎄, 그 절차가 빠르다고 감사 @Rainer Joswig. 파괴는 확실히'cdr '을 사용하는 것보다 멋지게 보입니다. 내가 실제로 계산하고자하는 것 :리스트의 요소들에 어떤 조건이 있다고 가정합니다 (예 : 합계는 42와 같습니다). 조건을 만족하는 모든 값 쌍을 목록에서 찾고 싶습니다. – Aroob

+0

@Aroob like'(루프 : for (head. tail) : on리스트 : nconc (loop : for : 꼬리 : if (= target (+ head item)) : collect (head item을 나열))'? – Sylwester

+0

@Sylwester 예, 그렇습니다; RainerJoswig은 이미 이것을 대답에 포함 시켰습니다. 나는 내가 정말로 원했던 것이 목록 내포와 같은 것이라고 생각한다. 그러나 지금은 이것이 제 목적을위한 것입니다. – Aroob

관련 문제