2012年9月7日金曜日

Racket で R6RS を利用する

1. R5RS

Scheme の言語仕様には、R5RS と R6RS がある。

Scheme – Wikipedia によると、

… その仕様はRevisedn Report on the Algorithmic Language Scheme (RnRS)と呼ばれている。現在広く実装されているものは改訂第五版に当たるR5RS(1998年)であり、2007年にはR6RSが策定された。

Racket は、Scheme から派生した言語。R5RS でコードを書きたい場合、メニューより

  • Language > Choose Language > Choose a language > R5RS

を選択する。

SnapCrab_Choose Language_2012-9-7_21-25-0_No-00

 

2. R6RS

R6RS とは、Scheme – Wikipedia によると、

2007年9月に新仕様「The Revised6 Report on the Algorithmic Language Scheme (R6RS)」[5] が成立した。4部構成となり、R5RSに比べおよそ3倍の文章量となった。今までは小さな言語仕様に対してのこだわりが見られたが、Unicodeサポート等の実用的な言語として必要な要素が盛り込まれている点が特徴的である。

R6RS:概要と例 によると、

R6RS準拠のSchemeプログラムは、ひとつのトップレベルプログラムと、いくつかのライブラリから構成されます。

トップレベルプログラムはSchemeプログラムの実行が開始されるコードです。先頭で必要とするライブラリをimportして、後はR5RSまでと同じように定義や式を並べておきます。定義と式はどのような順序で現れても構いません。上から順番に実行されます。

(import (rnrs)           ; R6RS baseと標準ライブラリをインポート
        (mylib mystuff)) ; (mylib mystuff)ライブラリをインポート

 

a. 言語の選択

Racket では、メニューより、

  • Language > Choose Language > Use the language declared in the source

を選択する。

SnapCrab_NoName_2012-9-7_22-40-46_No-00

R6RS: Scheme2 Running Top-Level Programs に、R6RS の利用方法が書かれている。

#!r6rs
(import (rnrs))
(display "hello\n")

1行目に、UNIX のスクリプトのように #! を記述をする。

シバン (Unix) – Wikipedia とは、

シバンまたはシェバン (shebang) とはUNIXスクリプト#!から始まる1行目のこと。起動してスクリプトを読み込むインタプリタを指定する。

 

b.新規ファイルを作成したときの自動入力

新規ファイルを作成したときに、1行目に自動的に #!r6rs を記述してほしい。

そのためには、メニューより、

  • Language > Choose Language > Use the language declared in the source

を指定した後、左下の Show Details ボタンを押し、Automatic #lang line に

#!r6rs

を入力しておく。

 

c.ライブラリの指定

1 Using R6RS with DrRacket には、複数のライブラリを指定する例が書かれている。

#!r6rs
(import (rnrs lists (6))
        (rnrs base (6))
        (rnrs io simple (6)))
(display (find even? '(3 1 4 1 5 9)))

読み込まれるライブラリは、5 Libraries and Collections によると、

(rnrs io simple (6))  means  (lib "rnrs/io/simple-6.rkt")
(rnrs)                means  (lib "rnrs/main-6.rkt")
(rnrs main)           means  (lib "rnrs/main_.rkt")
(rnrs (6))            means  (lib "rnrs/main-6.rkt")
(racket base)         means  (lib "racket/base.rkt")
(achtung!)            means  (lib "achtung%21/main.rkt")
(funco new-λ)         means  (lib "funco/new-%ce%bb.rkt")

ライブラリについて詳しくは、8 R6RS Libraries を参照。

 

d. #lang の意味

1行目の記述は、 R6RS Module Language によると、

The r6rs language is usually used in the form #!r6rs, which is equivalent to #lang r6rs and is also valid R6RS syntax.

#lang の意味は、6.2.2 The #lang Shorthand によると、

In the case of #lang racket, the syntax is

#lang racket

decl ...

which reads the same as

(module name racket

decl ...)

where name is derived from the name of the file that contains the #lang form.

 

3. Pretty Big

Legacy Languages として、R5RS と並んで Pretty Big がある。

2.2 Legacy Languages によると、

The PLT Pretty Big language provides a language roughly compatible with a language in earlier versions of DrRacket. It evaluates a program in the same way as load, and it starts by importing the following modules: mzscheme, racket/gui/base, mzlib/class, mzlib/etc, mzlib/file, mzlib/list, mzlib/unit, mzlib/include, mzlib/defmacro, mzlib/pretty, mzlib/string, mzlib/thread, mzlib/math, mzlib/match, and mzlib/shared.

 

関連サイト

2012年9月3日月曜日

DrRacket で Emacs 風にコードを補完するためのキーバインディング

1. デフォルトのキーバインディング

DrRacket でコードの補完をするには、

  • メニューより、Edit > Complete Word

を選択する。

デフォルトのキーバインディングでは、

C-/

に割り当てられている。

  • メニューより、Edit > Keybindings > Show Active Keybindings

で調べると、C-/ が Complete Word に割り当てられていることを確認できる。

 

2. Emacs のキーバインディングを利用している場合

a. Emacs の補完機能

DrScheme (Racket) で Emacs のキーバインディングを利用している場合、Complete Word にキーが割り当てられていない。

Emacs では、

M-/

によって、バッファ内にある単語を補完してくれる。

abbrev によると、

Abbrev とは要するに、略称展開です。…

M-/ (dabbrev-expand) は、カーソル直前の単語を、バッファ内にある単語で補完するコマンドなのです。

Dynamic Abbrevs - GNU Emacs Manual

M-/
Expand the word in the buffer before point as a dynamic abbrev, by searching in the buffer for words starting with that abbreviation (dabbrev-expand).

そこで、DrRacket でも M-/ でコードが補完されるようにしたい。

 

キーボードショートカットのカスタマイズ

3.3 Keyboard Shortcuts には、キーバインディングの例が書かれている。

For example, this remaps the key combination “control-a” key to “!”.

#lang s-exp framework/keybinding-lang

(keybinding "c:a" (λ (editor evt) (send editor insert "!")))

キーバインディングを有効にするには、上記内容のファイルを作成し、

  • Edit > Keybindings > Add User-defined Keybindings…

で読み込む。

 

補完機能の割り当て

には、補完機能のキーバインディングをカスタマイズするための具体的な方法が書かれていた。入力するキーだけを変更する。

#lang s-exp framework/keybinding-lang
(keybinding "m:/"
            (λ (editor evt)
              (if (is-a? editor text:autocomplete<%>)
                  (send editor auto-complete)
                  #f)))

各関数については、以下を参照。

キーバインディングを無効にするには、

  • メニューより、Edit > Keybindings > Remove …

を選択すれば良い。

 

関連記事

2012年9月2日日曜日

Google+ で特定のサークルから通知を受ける

1. 通知機能でメール以上チャット未満

SnapCrab_NoName_2012-8-30_14-4-27_No-00Google+ では、自分宛の投稿があると Google バーに通知される。

Google バーのお知らせ - Google+ ヘルプ によると、

お知らせを受け取ると、Google バーの通知エリアが赤色に変わり、新着お知らせの件数が表示されます。

Google バーは、Google の各種サービスに表示される。Google 検索にも表示されるので、自分宛の通知は気が付きやすい。

そのため、特定の相手にある程度早く、確実に知らせたいことがある場合、相手を指定して Google+ に投稿する。特に、読んでもらいたいサイトがあるとき、ブックマークレットを利用して通知する。

実際のところ、この目的のためだけに Google+ を使っている。

チャットを使えば、通知をリアルタイムに行うことができる。しかし、チャットは、相手や自分を必要以上に急かしてしまうコミュニケーション手段。別の作業をしている場合、気が散って作業効率が落ちてしまう。

Google+ は通知がキューに溜まっていく。メールと違い、わざわざメールボックスを開いて確認しなくても、通知内容に、さっと内容に目を通すことができる。通知を受ける相手を自分でコントロールすることもできる。そのため、チャットとメールの中間的なツールとして利用している。

 

2. サークルからの通知設定

通知機能は便利なので、自分宛ての投稿だけではなく、自分にとって重要なサークルに投稿があった場合に、Google バーに通知して欲しい。

Google+に投稿通知メールやおしゃべりなメンバーの“ミュート”機能 - ITmedia エンタープライズ によると、

Google+にはストリームで表示する投稿の量を、サークルごとにスライダーで調整する機能があるが、このスライダーの目盛が1つ増え、最も右(すべての新しい投稿のお知らせも登録します)に設定すると、サークル内の誰かが投稿するとプッシュ通知が送られてくる。

Google+ において、特定のサークルを表示し、スライダーを右端に設定した。

SnapCrab_NoName_2012-8-31_14-50-30_No-00

サークルのメンバーが合意してくれるなら、同じようにサークルの通知設定をしてもらっておけば、サークル内の投稿に早めに気づいてもらえる。

ごく親しい間柄で、このように設定しておくと、チャットに近いが、チャットほど急かされる感じのしない緩いコミュニケーション手段として使える。

2012年9月1日土曜日

Google+ で共有するためのブックマークレット - Share on Google+

Google+ に「今見ているサイトへのリンク」を投稿するためのブックマークレットが用意されている。

Share - Google+ Platform — Google DevelopersShare Bookmarklet によると、

Drag and drop this link to your Bookmarks Bar to be able to easily Share on Google+.

ブックマークレットを利用するためには、

  1. Share on Google+ をブックマークへ登録。
  2. 投稿したいサイトでブックマークレットをクリックする。

SnapCrab_NoName_2012-9-1_21-57-13_No-00

今まで別のブックマークレットを利用していたが、使えなくなったので乗り換えた。

追記(2013/04/06): Feedly の「feedly mini ボタン」でも Google+ へ簡単に投稿できる。

2012年8月30日木曜日

Google カレンダーで遠い過去にジャンプ

1. 月単位で移動するショートカットキー

Google カレンダーで数ヶ月前のカレンダーを表示したい場合、左上に表示されているミニカレンダーを使い、前月に移動を繰り返す。

マウスクリックが面倒な場合、キーボードショートカットを用いる。

  1. m : 月表示
  2. j, k : 翌月、前月へ移動

キーボードショートカットは ? を入力すると表示される。

 

2. 「年ビュー」と「日付を移動」を利用する

遠い過去のカレンダーを表示したい場合、Labs の機能を利用する。

  1. Goolge カレンダーの設定より、Labs を選択。
  2. 年ビュー」と「日付を移動」を有効にして、設定を保存する。

image2993

これにより、「年ビュー」と「日付を移動」がカレンダーの右端に表示される。

SnapCrab_NoName_2012-8-30_22-39-7_No-00

必要ないときは ▶ をクリックして閉じておくと良い。