Lisp学習ノート1——印刷素数

1460 ワード

(defun print-prime-number (&key (begin 2) (end 100))
	   (format t "prime number between ~d and ~d: " begin end)
	   (format t "~{~d~t~}"
		   (loop for i from begin to end
			when (loop for j from 2 to (sqrt i) never (= 0 (mod i j))) collect i)))
    1: (      )
(print-prime-number)
  :
prime number between 2 and 100: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 
NIL
  2: (   begin   end)
(print-prime-number :begin 2 :end 200)
  :
prime number between 2 and 200: 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199 
NIL
   ,      :
(defun prime-numbers (&key (begin 2) (end 100))
	   (loop for i from begin to end when (loop for j from 2 to (sqrt i) never (= 0 (mod i j))) collect i))
CL-USER> (prime-numbers :begin 2 :end 200)
(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97 101 103 107 109 113 127 131 137 139 149 151 157 163 167 173 179 181 191 193 197 199)

知識点:
1.キーワードパラメータの使用、&keyの後のパラメータ呼び出し時にbegin、:endと書く、どのキーワードに与える値を指定する.(begin 2 begin-p)とも書く、begin-pは、beginの値が伝達するか否かを示す.
2.loopの使用.loop var from i to j when bool-form collect var.収集(i,j)間でbool-form条件を満たす値であり、循環変数はvar.
3.(sqrt i)c言語に相当するsqrt(i).