LoginSignup
3
4

More than 5 years have passed since last update.

How to use "ros" in Emacs

Last updated at Posted at 2016-10-13

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)))
3
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4