2011년 4월 18일 월요일

[Elisp] List Enumeration

이번에는 Elisp(Emacs Lisp)에서 리스트를 순환하는 방법에 대해 소개.

(let (tmplist i element)
  (setq i = 0)
  (setq tmplist '("a" "b" "c" "d"))
  (while (< i (length tmplist))
    (setq element (nth i tmplist))
    (message element)
    (setq i (1+ i))
  ))
이딴 식으로 만들어 봤는데 에러가 있는지 동작 하는지 확인은 안해봤다. 그냥 직관적으로 while 문을 리스트 갯수(length) 만큼 루프를 돌면서 순서대로 리스트의 엘리먼트를 꺼내서(nth) message로 출력하려는 코드다.

하지만 리스트 위주의 언어인 Lisp을 계승한 Elisp이 이렇게 귀찮게 하도록 놔두지는 않았을 것이다. -_-;;
(let (tmplist)
  (setq tmplist '("a" "b" "c" "d"))
  (mapcar (lambda (e)
            (message e)
            ) tmplist)
  )
역시나 테스트는 안 해 본 코드. (mapcar function list) 문법을 이용했다.

mapcar는 각 리스트 마다 함수를 호출해 주는 식으로 동작한다. 여기서는 lambda로 임시함수(?)를 만들긴 했지만... 하여간 당연히 while문을 쓰는 것 보다 편한 것 같다.

특이한 건 mapcar가 호출하는 함수의 결과가 각 리스트에 대체되어서 들어 간다는 것. 위 lambda는 리턴값이 없으니 몽땅 nil이 들어갈 것 같다 -ㅁ-

한가지 더 추가하자면
(dolist (e '("a" "b" "c" "d")) (message e))
이게 더 간단하다는 것. 값을 바꿀 필요가 없다면 말이지 -_-a

댓글 없음 :