Lisp でパッケージを使いたかったので、Roswell ってのを導入してみたんですね。で、slime でも使いたいな、と……。
init.el
;; https://github.com/papaeye/dotfiles/blob/master/.emacs.d/init.el
(defun require-safe (requirelib)
"安全な require。読み込みに失敗してもそこで止まらない"
;; missing-ok で読んでみて、ダメならこっそり message でも出しておく
(let ((require-status (require requirelib (symbol-name requirelib) t)))
(or require-status (message (format "[require-safe] failed %s" requirelib)))
require-status))
;; slime
;; http://qiita.com/bori_so1/items/38182e4171fad82c7ff0
;; http://takoeight0821.hatenablog.jp/entry/2016/03/02/182449
(when (require-safe 'slime)
(slime-setup '(slime-repl slime-fancy slime-banner))
;; ros 対応
(setq inferior-lisp-program "ros run") ; インタフェース
(quickrun-add-command "lisp/sbcl" '((:command . "ros")))) ; quickrun
(add-to-list 'auto-mode-alist '("\\.ros\\'" . lisp-mode))
c.f. RoswellでCommon Lisp環境をセットアップする - ギークもどきの日記帳
ところで
fibo.lisp
(defvar nn 3)
(defvar n 40)
(defun print-second (time)
(format t "処理にかかった秒数: ~A~%"
(float (/ time internal-time-units-per-second))))
(defun fibo-1 (x)
(if (or (= 0 x) (= 1 x))
1
(+ (fibo-1 (- x 1)) (fibo-1 (- x 2)))))
(defun fibo-2 (n &optional (a1 1) (a2 0))
(if (< n 1)
a1
(fibo-2 (1- n) (+ a1 a2) a1)))
(let ((a (get-internal-real-time)))
(format t "~a 番目のフィボナッチ数 非末尾再帰版~%" n)
(dotimes (x nn) (fibo-1 n))
(print-second (- (get-internal-real-time) a)))
(let ((a (get-internal-real-time)))
(format t "~a 番目のフィボナッチ数 末尾再帰版~%" n)
(dotimes (x nn) (fibo-2 n))
(print-second (- (get-internal-real-time) a)))
(exit)
% ros filo.lisp
とかで実行できるんですけど、最後に (exit)
が無いとエラーになるんです。
ros init fibo
とかで作らないと駄目なんかなあ……。
まあ、今後の課題ということで。
追記
(exit)
の件について、コメント欄でご指導頂いたのですが、忙しさにかまけて「いいね」だけして放おっておいたら、ご削除されました。
不義理をするものじゃないですねorz
RoswellでCommon Lisp環境をセットアップする - ギークもどきの日記帳 を読んでちょっと解ったのですが、 main
というのはエントリ・ポイントなんですね。
つまり C でいうところの
int main(char* argv[], int argc)
みたいなものなんですね。
で、以下のように書いたら動いたんですが、多分、まだ誤解しているorz
fibo.ros
(defun main ())
(defvar nn 3)
(defvar n 40)
(defun print-second (time)
(format t "処理にかかった秒数: ~A~%"
(float (/ time internal-time-units-per-second))))
(defun fibo-1 (x)
(if (or (= 0 x) (= 1 x))
1
(+ (fibo-1 (- x 1)) (fibo-1 (- x 2)))))
(defun fibo-2 (n &optional (a1 1) (a2 0))
(if (< n 1)
a1
(fibo-2 (1- n) (+ a1 a2) a1)))
(let ((a (get-internal-real-time)))
(format t "~a 番目のフィボナッチ数 非末尾再帰版~%" n)
(dotimes (x nn) (fibo-1 n))
(print-second (- (get-internal-real-time) a)))
(let ((a (get-internal-real-time)))
(format t "~a 番目のフィボナッチ数 末尾再帰版~%" n)
(dotimes (x nn) (fibo-2 n))
(print-second (- (get-internal-real-time) a)))