Common Lisp備忘録

忘れた記憶を取り戻す

ABC 002b.lisp

標準入力した文字列を、文字を要素とするリストに変換

(let* ((lst (concatenate 'list (read-line)))
       (lst2 (mapcar #'type-of lst)))

  (format t "~A~%" lst)
  (format t "~S~%" lst)
  (format t "~A~%" lst2)
  (format t "~S~%" lst2))

とすると

 » cl 002b.lisp
hello
(h e l l o)
(#\h #\e #\l #\l #\o)
(STANDARD-CHAR STANDARD-CHAR STANDARD-CHAR STANDARD-CHAR STANDARD-CHAR)
(STANDARD-CHAR STANDARD-CHAR STANDARD-CHAR STANDARD-CHAR STANDARD-CHAR)

となる。ただし、helloは標準入力であり、clはalias cl=clispである。
なお、FORMAT関数の~aはaesthetic、~sはstandardであり、コンピュータに優しい表記だとCommon Lispの文字は#\aなどの表記になる。

ACしたソースコード

上記の仕様確認用のコードを削除し、以下のように書き直した。

(format t "~A~%" (remove-if #'(lambda (x) (find x "aiueo")) (read-line)))

find

[1]> (find #\a "aiueo")
#\a
[2]> (concatenate 'list "aiueo")
(#\a #\i #\u #\e #\o)
[3]> (find #\a (concatenate 'list "aiueo"))
#\a

のように

(find アイテム シーケンス)

で、シーケンスの要素を返す。

remove-ifとlambdaと高階関数

関数を引数として受け取る関数を高階関数という。

[9]> (remove-if #'(lambda (x)
               (find x "aiueo"))
           "hello")
hll