커먼 리스프:&rest 매개변수 작업
-
08-07-2019 - |
문제
&rest에 지정된 값에 저장된 매개변수를 사용하여 작업하는 방법을 알려주실 수 있는 분 계신가요?
나는 많은 것을 읽었으며 작성자는 모든 매개변수를 나열하는 방법만 알고 있는 것 같습니다.
(defun test (a &rest b) b)
보기에는 좋지만 그다지 유용하지는 않습니다.
지금까지 제가 찾은 가장 좋은 방법은 첫 번째, 두 번째 등을 사용하여 원하는 매개변수를 얻는 것입니다.
(defun test (a &rest b)
(first b))
이 방법은 10번째 매개변수에서 작동이 중지되는 것으로 나타났습니다. 그러나 사양(내가 읽은 내용에 따르면)에서는 최소 50개를 지원합니다.50개의 매개변수를 사용할 가능성이 희박하더라도 이들 모두에 액세스하는 방법을 알고 싶습니다.
감사해요
해결책
액세서 기능에서 첫 번째, 두 번째 및 SO는 자동차/CDR 또는 NTH 위에 "단지"유틸리티 기능입니다. 따라서 특정 질문에 대한 답은 "NTH 또는 ELT 사용"(또는 자신의 특정 액세서 기능을 구축)입니다.
원한다면 11 번째를 다음과 같이 정의 할 수 있습니다.
(Defunenth (목록) (Nth 10 List)))
그러나, 나는 & REST 목록에 주어진 논증의 특정 위치를 돌보지 않고, 내가 무언가를하고 싶은 일이 0 개 이상있을 때 주로 사용 및 휴식 인수를 사용한다는 것을 알았습니다. 그것은 일반적으로 루프, do 또는 dolist를 사용하여 인수를 가로 지르고 각각과 함께 무언가를하는 것을 수반합니다. 지도 패밀리 또는 (때때로) 감소합니다.
다른 팁
나머지 매개변수는 단지 목록일 뿐입니다.일반적인 목록 작업을 사용하여 처리할 수 있습니다.
(defun test (a &rest b))
(dolist (s b)
(when (> s 1)
(print s)
(do-something-else b)))
실제로 기능이 유용합니다. 당신은 그것을 시도하면됩니다.
CL-USER 1 > (defun test (a &rest b) b)
TEST
CL-USER 2 > (test 1 2 3 4)
(2 3 4)
따라서 B는 단지 논쟁의 목록 일뿐입니다. 따라서 모든 목록 및 시퀀스 작업이 적용됩니다. 마법은 없습니다. Nth 요소에 액세스하는 기능, 요소를 제거하는 기능 등 ..
공통 LISP hyperspec에서 관련 기능이 나열됩니다.
기본 LISP 튜토리얼의 경우 ToureTzky의 책을 확인하십시오.
일반적인 LISP : 상징적 계산에 대한 부드러운 소개
이 책은 PDF 및 PostScript로 다운로드 할 수 있습니다. 기본 공통 LISP를 가르칩니다.
파괴 구조를 사용할 수도 있습니다.
(defun my-function (&rest arguments)
(destructuring-bind (a b &rest c) arguments
(format nil "~A,~A followed with ~A" a b c)))
CL-USER> (my-function 1 2 "Give" 'me "more" 'arguments!!)
==> "1,2 followed with (Give ME more ARGUMENTS!!)"
나는 단지 그들 모두를 통과하기 위해 재귀적인 반복을 가지고 있습니다. Dolist가 더 좋다고 생각하지만 구식 방법을 사용하는 것을 좋아합니다.