2016-10-23 6 views
1

나는 common-lisp의 초보자이며 재미로만 사용합니다. 그러나 하이퍼 스펙과 다른 장소의 문서가 꽤 명확하기 때문에 맵퍼와 맵퍼의 차이점을 알고 있다고 가정합니다.원자에 대한 Mapcan의 동작

그러나 mapcan 함수가 목록 요소를 호출하면 요소가 목록 대신 원자로 평가됩니다. mapcan이 nconc를 사용하여 목록을 추가하면 목록이 없으면 오류가 발생할 것으로 예상됩니다. 내가

(mapcan (lambda (x) (+ 2 x)) '(1 2 3 4)) 

을 시도하는 경우

는하지만 SBCL 및 CLISP에서 '6'으로 평가한다. (이 예제에 대한 실용적인 필요가 없을 수도 있습니다, 난 단지 궁금 해서요) 값을 반환하는 것이 단순한 오류보다 좋을 수도 있지만 nconc에 대한 목록이 없으면 mapcan이 마지막 값을 반환한다는 것을 알 수 있습니다.

이 동작에 대한 이유가 있습니까?

+1

LispWorks 및 GCL에서 오류가 발생했습니다. –

답변

2

the documentation for mapcan(mapcan (lambda (x) (+ 2 x)) '(1 2 3 4))(apply #'nconc (mapcar (lambda (x) (+ 2 x)) '(1 2 3 4)))과 동일해야하며 오류 메시지는입니다.

hyperspec은 nconc이 올바른 목록으로 수행해야하는 작업과 마지막으로 인수로 nil을 표시합니다. 그것은 다른 설명이 없기 때문에 sbclclisp은 공용 도메인에서 lisp의 알고리즘을 공유하거나 동일한 구현 결과와 비슷하게 구현했습니다.

당신은 아마 같은 행동을 할 것이다 다른 구현을지지 않습니다 그래서 당신은 mapcan에 전달 된 기능을 항상 nconcthe specification 내 -ed 할 수있는 신선한 목록 또는 nil를 돌려 확인해야합니다.