リスト要素の回転をするプログラムを関数プログラミングしなさい。(Lispで実装しなさい。)
ソースコード
(defun rotate (x n) (cond ((= n 0) x) ((> n 0) (rotate (append (cdr x) (cons (car x) nil)) (- n 1))) ((< n 0) (rotate x (+ (length x) n))) ) ) (clear) (rotate '(1 2 3 4 5 6 7 8 9) 2) (rotate '(1 2 3 4 5 6 7 8 9) -3) (rotate '(1 2 3 4 5 6 7 8 9) 9) (rotate '(1 2 3 4 5 6 7 8 9) -18)
実行結果
t > (rotate '(1 2 3 4 5 6 7 8 9) 2) (3 4 5 6 7 8 9 1 2) > (rotate '(1 2 3 4 5 6 7 8 9) -3) (7 8 9 1 2 3 4 5 6) > (rotate '(1 2 3 4 5 6 7 8 9) 9) (1 2 3 4 5 6 7 8 9) > (rotate '(1 2 3 4 5 6 7 8 9) -18) (1 2 3 4 5 6 7 8 9)
その他、感想
関数型プログラミング言語Lisp
関数型プログラミング言語Lispに関して、今までの言語では、代入したり、ループしたりする文の書き方に差がありましたが、Prologと同様にLispでも、car, cdrのたった二つの文法だけで、すべての文が構成されていて、他言語のように文法規則が乱雑することなく、規則が凝縮された感じがして、Lispの開発者ジョン・マッカーシーさんの発想(Prolog)がすごいと思いました。 そして、Lispはプログラムを作る上で覚える部分の少ない言語だとも改めて思いました。今まで使っていたような言語(論理型でも、関数型でもない言語)では、引数の数が多かったり、ストリングのときは%dを使ったり、様々な文法がありましたが、この2つに抑え、シンプルな構造をしている。そんな風に感じました。