2011-09-15 2 views
1

나는 람다 함수를 이해하지 못한다.lisp에 관한 질문 Lisp의 Land의 예제에서 Lambda 함수들

(defun edges->dot (edges) 
    (mapc (lambda (node) 
      (mapc (lambda (edge) 
        (fresh-line) 
        (princ (dot-name (car node))) 
        (princ "->") 
        (princ (dot-name (car edge))) 
        (princ "[label=\"") 
        (princ (dot-label (cdr edge))) 
        (princ "\"];")) 
       (cdr node))) 
     edges)) 

그냥 지금 여기에 내부를 살펴 보자 :

(mapc (lambda (edge) 
     (fresh-line) 
     (princ (dot-name (car node))) 
     (princ "->") 
     (princ (dot-name (car edge))) 
     (princ "[label=\"") 
     (princ (dot-label (cdr edge))) 
     (princ "\"];")) 
     (cdr node))) 

내가 기능 mapc는 두 개의 인수, 함수 및 소요 것으로 알고 여기에 리스프의 책 땅에 들어있는 예제 기능입니다 목록. 또한 lambda (node)을 사용하여 하나의 인수 (node)를 첫 번째 인수로 사용하는 mapc의 익명 함수를 전달하고 mapc의 두 번째 인수로 (cdr node)을 사용한다는 것을 이해합니다. 적어도 나는 그것이 계속되고 있다고 생각한다!

익명의 기능이 edge의 값을 (lambda (edge)에 가져 오는 부분이 어디인지 이해할 수 없습니다. 누군가가 나에게 설명해 주시면 감사하겠습니다.

답변

2

edge 인수는 (cdr node)의 항목에서 가져옵니다. 내부 람다는 (cdr node)에있는 각 요소에 대해 한 번 호출됩니다.

(mapC#'princ '(1 2 3 4 5)) 

를 또는, 문자 람다와 함께 :

예를 들어이 시도

(mapC#'(lambda (x) 
      (princ x) 
      (terpri)) 
     '(1 2 3 4 5)) 
+0

좋아, 그래서 MAPC의 첫 번째 인수 만의 함수이어야한다는 말을 올바른 것 하나의 논쟁? – MikeJerome

+0

@MikeJerome : 하나의 목록을 전달하는 경우 수정하십시오. 일반적으로 함수는 전달할 목록만큼 많은 인수를 사용합니다. –

+0

멋지다. 지금은 이해합니다. 도와 주셔서 감사합니다. – MikeJerome