ラベル Scheme の投稿を表示しています。 すべての投稿を表示
ラベル Scheme の投稿を表示しています。 すべての投稿を表示

2013-09-02

Gauche を Mac にインストールした

Scheme の処理系として Mac に Gauche をインストールしてみた。

brew コマンド一発で入った。

$ brew install gauche

Gauche の実行コマンドは gosh。ちょっとハマった。

$ gosh
gosh>

あとがき

社内で SICP (計算機プログラムの構造と解釈) の勉強会をしてみようという話になったので、とりあえず Scheme の処理系をインストール。SICP 本を読むのは初めて。う〜ん、どうなるか楽しみ。

計算機プログラムの構造と解釈
計算機プログラムの構造と解釈

2012-06-28

if (条件A || 条件B) の条件文が長くなったら、どこでコードを折り返すか?

先日、Twitter でタイトルの様な質問に出会った。この問いに簡単に答えたのだけど、140 字では全てを伝えきれないので、改めてブログのエントリーにする。

前置き

短い if 文をこう書くとする。

if (条件A || 条件B) 省略

if 文の中が長くなった時、読みづらい。

if (とっても長〜〜〜い条件A || とっても長〜〜〜い条件B) 省略

この時、どう書くのが良いか? 一例としてこんなのがある。

if (
    とっても長〜〜〜い条件A ||
    とっても長〜〜〜い条件B
) 省略

|| を条件式の後ろに置く書き方。

私見

ぼくは || を条件式の前に置く書き方を好む。

if (
    とっても長〜〜〜い条件A
    || とっても長〜〜〜い条件B
) 省略

インデントが少し崩れる。これはデメリットとして認める。

それよりも、「OR」である事が行頭を見るだけで分かるメリットを強調したい。「前置き」に例示した行末に置くやり方だと、行末まで目を動かさないと、条件式が || で繋がっていることを確認できない。

ぼくらは最初から if (条件A || 条件B) というコードを見ているので「OR」だと分かっているけれども、実際にコードを読む時はそれが「OR」なのか「AND」なのか分かっていない。行頭に置けば、初めて読むコードでも一目瞭然になる。

if (
    とっても長〜〜〜い条件A
    || とっても長〜〜〜い条件B
    || とっても長〜〜〜い条件C
    || とっても長〜〜〜い条件D
    || とっても長〜〜〜い条件E
) 省略

条件文が複雑になった時も、読みやすい。理解しやすい。

if (
    (
      とっても長〜〜〜い条件A
      || とっても長〜〜〜い条件B
    )
    &&
    (
      とっても長〜〜〜い条件C
      || とっても長〜〜〜い条件D
      || とっても長〜〜〜い条件E
    )
) 省略

分かりやすい、ということはバグが減るということ。コーディング一つ取っても、少し気を配るだけでバグを減らせる。

あとがき

本来、こういった長い条件文は、別関数にするのが定石。

ただ、プロファイルを見たらループの中の if 文の条件文がネックになってて、関数呼び出ししないコードにすることでプログラムの致命的な遅さが解決する... なんて泥臭いケースがある。マクロ (Lisp など) やインライン関数 (C99, C++ など) が使える言語なら幸せだけど、そういう言語を使っていない場合もある。

そういう場合に備えて、一つ頭の隅に入れておいてもらえれば。

なお、これはあくまでぼくのやり方にすぎない。他に良い方法があれば、是非、ブログの記事にして欲しい。

2006-12-03

Emacs で Scheme の関数の説明を info から参照する

Emacs には info-lookup-symbol というコマンドが用意されていて、これを使うと、カーソル下の関数の解説を info で読むことができる。例えば、C のソース・ファイルを開いて、関数 strtod の上で M-x info-lookup-symbol してみる。すると、libc.info の「Parsing of Floats」というノードが開かれる。

info-lookup-symbol を使うには、まず、その言語の info が存在すること。そしてメジャー・モードと info の対応表が必要になる。Gauche という Scheme 処理系をインストールすると、プログラミング言語 Scheme の日本語 info マニュアルが手に入る。そこで、その Gauche info を Scheme モードから使う設定を紹介しませう。

なお、コマンド info-lookup-symbol は、Emacs-21 系では C-h TAB に、Emacs 22.* では C-h S にキーバインドされている。

Gauche info のインストール

次のコマンドを実行して、Gauche info がインストールされているかどうかを確かめやう。

  • C-h i m Gauche (ja) RET

これで、Gauche のマニュアルが開いたら、この節で読むことは何もない。次の節へお進みあれ。

Gauche のマニュアルが開かなかった? なら、root になって /usr/local/info/dir を開きませう。そして、ファイルの後ろの方に次の一行を追加する。保存するのを忘れないように。

* Gauche (ja): (gauche-refj.info).  An R5RS Scheme implementation.

Emacs を再起動して、もう一度上のコマンドを実行しませう。Gauche info は読める? 読めれば OK。読めないやうなら、それは貴方のシステムに Gauche が入っていない可能性が高い。次の記事を読んで、Gauche をインストールしませう。

インストール後に /usr/local/info/dir の編集をして、Gauche info を読めるやうにする。

Scheme モードで Gauche info を開く設定

Emacs に、Scheme モードから Gauche info を開くことを教えてやらなくてはならない。詳しい解説が下記リンク先にある。

ただ、上記ページの設定は少々マニアック。ぼくは .emacs に次のコードを追加している。

(eval-after-load "info-look"
  '(progn
     (info-lookup-add-help
      :topic 'symbol
      :mode 'scheme-mode
      :regexp "[^()`',\"\t\n]+"
      :ignore-case t
      :doc-spec '(("(gauche-refj.info)Index - 手続きと構文索引" nil
                   "^ -+ [^:]+: *" "[\n ]")
                  ("(gauche-refj.info)Index - モジュール索引" nil
                   "^ -+ [^:]+: *" "[\n ]")
                  ("(gauche-refj.info)Index - クラス索引" nil
                   "^ -+ [^:]+: *" "[\n ]")
                  ("(gauche-refj.info)Index - 変数索引" nil
                   "^ -+ [^:]+: *" "[\n ]"))
      :parse-rule "[^()`',\" \t\n]+"
      :other-modes nil)

     (info-lookup-add-help
      :mode 'inferior-scheme-mode
      :other-modes '(scheme-mode))
))

これで、Scheme の分からない関数があれば、すぐに Gauche の info をひける。Scheme 使いは、是非お試しあれ。便利。

2006-11-28

Emacs で快適に Lisp / Scheme ソースを編集する

Emacs には EmacsLisp のインタープリターが内蔵されている (正確には EmacsLisp の処理系の上に Emacs というエディターが構築されてる) ので、EmacsLisp のソースを編集しながら評価が可能。EmacsLisp 程強力ではないけれど、同じようことを Common Lisp (あるいは Scheme) でもやれる。

※以下の説明は、Emacs 22 用のもの。Emacs 21 で同じことが出来るかは確かめてない。

Common Lisp の場合

まず、Emacs から呼び出す Common Lisp の処理系を .emacs で設定する。clisp を使うなら、こんな感じ。

(setq inferior-lisp-program "clisp")

Lisp のソース・ファイルを開いたら、次のコマンドを実行。

M-x run-lisp

すると、shell モードの Lisp バージョンが起動する。こんな感じ。

  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I  \ `+' /  I      8         8           8     8        8    8
   \  `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2004


[1]> 

これを inferior lisp モードと呼ぶらしい。ここでは、簡便に lisp shell と呼ぼう。

ソース・ファイルを編集して、括弧の後ろで C-x C-e すると、直前の S 式が lisp shell に送られる。例えば、

(reverse '(3 2 1))-!-

上のコードをソース・ファイルに書いて、-!- の位置で C-x C-e してみやう。すると、lisp shell で上記 S 式が評価され、その結果が表示される。

[1]> (1 2 3)
[2]> 

数引数を付けると (C-u C-x C-e)、C-x C-e 後に lisp shell に switch-buffer する。

ちなみに、M-C-x は、Emacs Lisp mode と同じように、トップレベルの S 式を lisp shell に送る。リージョンの実行は、C-c C-r

Scheme の場合

Common Lisp の場合とほぼ同じ。相違点だけ書いておきませう。

Scheme の処理系は、以下のやうに設定する (下の例は Gauche を使う場合)。

(setq scheme-program-name "gosh -i")

M-x run-lisp の代わりに、次のコマンドを実行する。

M-x run-scheme

後は、Scheme のソースを書きながら、C-x C-e, M-C-x, C-c C-r で楽しい Scheme life をどうぞ。

追記: Scheme と Emacs の連携については、次のページも参考になる。

Gauche CVS のインストール

プログラミング言語 Scheme の処理系の一つ、Gauche の CVS 版をインストールした。少々、躓いたので後々のためにメモ。

参考サイトは以下。

CVS 版の取得

$ cvs -z3 -d:pserver:anonymous@gauche.cvs.sourceforge.net:/cvsroot/gauche co Gauche

コンパイルとインストール

CVS 版には、configure が用意されてない。configure の作成方法は、Gauche/HACKING に書かれている。

手順だけ書くとこんな感じ。

$ ./DIST gen
$ gauche-config --reconfigure | sh
$ make
$ make check
# make install

コマンド gauche-config は、前回インストールした gauche と同じコンパイル・オプションを取って来て、configure を実行する。もちろん、gauche が既にインストールされてないといけない。tar ball から gauche のバージョン・アップをする時に使う。

新規インストールの場合は gauche-config に替えて (素直に) configure を実行すればいい (と思う)。