2017-12-10 5 views
-2

LISP 목록의 문자 만 인쇄하고 CLisp에서는 원자가 숫자가 아닌지 확인해야합니다. 어떻게해야합니까?원자가 LISP의 숫자가 아닌지 어떻게 확인할 수 있습니까?

(loop for thing in list 
    do (if (numberp thing) 
      (format nil “I’m a number: ~a~%” thing) 
      (format nil “Not a number!~%”) 

format 것은 C.에서 printf 그리고 loop 유사 커먼 리스프의 반복에 대한 매크로입니다 :

+3

http://www.lispworks.com/documentation/HyperSpec/Body/f_nump.htm#numberp – melpomene

+1

[LISP를 배우는 가장 좋은 방법은 무엇입니까?] (https://stackoverflow.com/questions/398579/)의 복제본이있을 수 있습니다. 가장 좋은 방법 - 배우기 - 리스프) – Deep

답변

1

여기 방법 목록을 반복하지 수있는 것을 확인하려면입니다. "영어로 키워드를 읽고 그들이 의미하는 바를 추측해라"는 말의 의미를 설명하는 것은이 답변의 범위를 넘어서며 loop 온라인의 많은 설명이 있습니다. 예를 들어 Peter Seibel의 의 "Black Belt Loop"장 Practical Common Lisp은 무료 온라인으로 제공됩니다.

다음은 목록의 문자를 쓰는 방법입니다. 다양성을 위해이 함수는 명시 적으로 함수를 정의하고 명시 적 루프 대신 상위 순서 목록 조작 함수를 사용합니다. 따라서 아마 더 느릴 것입니다.

(defun print-characters (list) 
    (let ((chars (remove-if-not #’characterp list))) 
    (mapC#’write-char chars))) 

remove-if-not 그것만 (이 경우에 characterp) 술어 true를 반환하는 요소를 포함하는 것을 제외하고, 입력과 동일한 내용의 새로운리스트를 반환한다. characterp은 입력이 문자 인 경우에만 true를 반환합니다.

mapc은 반환 값을 버리고 목록의 각 요소에 함수를 적용합니다. 이 경우 write-char 하나의 인수로 호출하면 *standard-output*에 문자를 씁니다.

+0

왜이 기능을 확장 할 수 있습니까? 일부 논평은 좋을 것이다. –

1

나는 당신이 묻는 것이라고 가정하고 있습니다. "항목 목록이 있다면, 만을의 목록에있는 숫자로 걸러 낼 수 있습니까?"

CL-USER 11 > (setq mylist '(4 "foo" 10 'bar 2.5 "baz")) 
(4 "foo" 10 (QUOTE BAR) 2.5 "baz") 

모든 번호를 얻으려면 :

CL-USER 13 > (remove-if-not #'numberp mylist) 
(4 10 2.5) 

그리고 반대의 작업을 수행하는 (완전성)을 (리스트 감안할 때

:

네, 여기 샘플 세션의 ie 는 숫자를 제거합니다) :

CL-USER 14 > (remove-if #'numberp mylist) 
("foo" (QUOTE BAR) "baz") 
관련 문제