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

2013年2月18日月曜日

Scheme で car, cdr の組み合わせ

1. c ではじまり r で終わる関数

cons 関数によりペアが作られる。ペアの第1要素を得る関数は car 。第2要素を得る関数は cdr 。

連続して car, cdr をペアに適用するため関数が用意されている。関数名は `c’ ではじまり `r’ で終わる。

SnapCrab_NoName_2013-2-18_3-0-13_No-00

cr の間に入れる文字は `a’ または `d’ 。それぞれ car, cdr に対応している。

Structure and Interpretation of Computer Programs によると、

9 Since nested applications of car and cdr are cumbersome to write, Lisp dialects provide abbreviations for them -- for instance,

The names of all such procedures start with c and end with r. Each a between them stands for a car operation and each d for a cdr operation, to be applied in the same order in which they appear in the name. The names car and cdr persist because simple combinations like cadr are pronounceable.

11.9 Pairs and lists

(caar pair)‌‌procedure

(cadr pair)‌‌procedure

[r6rs-Z-G-D-1.gif]

(cdddar pair)‌‌procedure

(cddddr pair)‌‌procedure

These procedures are compositions of car and cdr, where for example caddr could be defined by

(define caddr (lambda (x) (car (cdr (cdr x))))).

CAR and CDR - Wikipedia > Continued acceptance

car and cdr have the advantage that short compositions of the functions can be given short and more or less pronounceable names of the same form.

 

2. c と r の間にある a, d は適用する順を表す

例えば、

(define xs '(1 (20 21 22) 3 4 5))
(display (caadr xs))    ; 20

c と r の間にある文字列 `aad’ を見て、順に cdr, car, car を適用する。

SnapCrab_NoName_2013-2-18_3-24-32_No-00

c と r の間にある文字列が `dad’ の場合は、cdr, car, cdr と適用する。

(display (cdadr xs))    ; (21 22)

 

3. Racket に用意されている関数

Racket には car, cdr を 4つまで合成した関数が用意されている。

3.9 Pairs and Lists > 3.9.6 Pair Accessor Shorthands によると、

2つの組み合わせ。

3つの組み合わせ。

4つの組み合わせ。

2012年9月28日金曜日

DrRacket でコードの整形

1. メニューから選択する

Emacs でコードの整形をする場合、C-M-\ を入力し、indent-region を呼び出す。

DrRacket でコードの整形をするには、

  1. インデントを整えたい式を範囲選択しておく。
  2. メニューより、Racket > Reindent を選択する。

表示されている全てのコードを整形するには、Reindent の下にある Reindent All を選ぶ。

 

2. キーボードで操作する

キーボードから、メニューの Racket > Reindent を選択するには、他のアプリケーションと同様に、

  • Alt, r, r

のキーを順に押せば良い。

もっと簡単に Reindent するには、整形するコードを選択した後、

  • Tab キー

を押す。

3.1 Menus によると、

Reindent : Indents the selected text according to the standard Racket formatting conventions. (Pressing the Tab key has the same effect.)

 

3. 移動、選択、整形の操作手順

コードを整形するには、式を選択する必要がる。S 式を選択するには、

3.3 Keyboard Shortcuts 

M-C-SPACE : select forward S-expression

 

ところで、DrRacket を Emacs のキーバインディングで利用している。また、Escape キーの入力は C-[ で代用している。

例えば、次のような式を入力した後、結果を display 手続きに渡したくなったとする。

(* 3
   (+ 1 2)
   (- 10 5))

キャレットが式に末尾にある場合、

  1. 先頭へ移動: Ctrl キーを押しながら [, b
  2. S 式の選択: Ctrl キーを押しながら [, Space
  3. 括弧で括る: Ctrl キーを押しながら [ 。次に ( を入力する。
  4. display と入力。

M-( : wrap selection in parentheses

このとき、キャレットは display の右横にある。

(display (* 3
   (+ 1 2)
   (- 10 5)))

全体を整形するために、

  1. 外側の括弧へ移動: Ctrl キーを押しながら [, u
  2. S 式の選択: Ctrl キーを押しながら [, Space
  3. 整形: Tab
  • M-C-u : move up out of an S-expression

  • M-C-d : move down into a nested S-expression

  •  

    4. その他

    メニューより、Edit > Keybindings > Show Active Keybindings を選択すると、現在有効なキーバインディングの一覧が表示される。

    S 式を選択する (forward-select-sexp) キーとして、上記以外に、

    • esc;c:s:f

    とあるが、キーを入力しても、forward-select-word

    • esc;s:f

    と同じ動作になってしまう。

    6.16 keymap% によると、

    For a special keyword, the capitalization does not matter. However, capitalization is important for single-letter keynames. Furthermore, single-letter ASCII keynames are treated specially: A and s:a are both treated as s:A. However, when c: is included on Windows without m:, or when d: is included on Mac OS X, then ASCII letters are not upcased with s:, since the upcasing behavior of the Shift key is cancelled by Control without Alt (on Windows) or by Command (on Mac OS X).

    その他、タブの入力に関する動作を以下に挙げておく。

    Index

    tabify
    tabify-all
    tabify-on-return?
    tabify-selection

    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 …

    を選択すれば良い。

     

    関連記事

    2010年1月2日土曜日

    DrScheme (Racket) で Emacs のキーバインディング

    1. 継続を理解するために Scheme を学びたい

    関数型言語を学んでいると、どこかで「継続」や「マクロ」という概念に出くわす。

    継続といえば Scheme 。 Scheme – Wikipedia によると、

    SchemeはMITコンピュータ科学・人工知能研究所の研究者だったガイ・スティールとジェラルド・ジェイ・サスマンによって、1975年ごろから開発・公開が始められた。もともとの開発の動機は、継続末尾再帰といったプログラミングのコンセプトを使って、彼らが研究していた並行プログラミングにおける制御構造の理論を検証するためだったという。

    Haskell では Continuation モナド で継続による計算を実現している。これを理解するには、Scheme の継続を予め理解しておく必要がある。

    Lisp 系の言語はこれまで学んだことがない。SICP をいつか読みたいと思いつつ、ずっと放置していた。

    SICP を学ぶ前に、以下のサイトで Scheme を勉強することにした。

     

    2. DrScheme (Racket) で Scheme を試す

    もうひとつの Scheme 入門 では、Scheme の処理系として

    が紹介されている。

    Racket – Wikipedia によると、

    Racket では関数型のコア言語,に加え、以下のような幅広い種類の構造を自由に統合させている。

    • mixin クラスシステム。
    • Standard MLのように洗練されて表現力豊かなコンポーネント(モジュール)システム。
    • 高階言語杳としては初めてのコントラクトシステム。[4]
    • メタプログラミングのためのパワフルなマクロシステムをもつ。
    • 実用的なシステムとして、最初に部分継続を実装した。

    Scheme 入門 1. Scheme 処理系のインストール によると、

    DrScheme を利用する場合は MzScheme も同時にインストールされます。そのため、MzScheme を単独でインストールする必要はありません。実は、MzScheme は PLT-Scheme という処理系のエンジン部分で、DrScheme は PLT-Scheme のフロントエンドです

    お気軽に Scheme に触れるには DrScheme を使うのが良い。

    他のエディタから利用するには、以下を参照。

     

    3. Emacs のキーバインディングを利用する

    DrScheme のデフォルトのキー操作は使いにくい。 (+_+) Emacs のキーバインディングにするには設定を変更する。

    3.3 Keyboard Shortcuts によると、

    If you are most familiar with Emacs-style key bindings (especially on windows or some linux installations where the control key is, by default, for the menu shortcuts), you should uncheck the Enable keybindings in menus preference. Many of the keybindings below are inspired by Emacs.

    メニューより、「Edit > Preferences… > Editing > General」の Enable keybindings in menus のチェックをはずす。

    testtest.png

    ただし、メタキーの入力は Escape キーを利用する。

    On Windows and Mac OS X, Meta is only available through the Escape key.

    (同上より)

     

    3. コードの実行と編集

    DrScheme (Racket) では、

    • F5 でコードの実行
    • F6 でエディタに戻る

     

    4. 移動

    括弧単位でカーソルを移動するには、3.3 Keyboard Shortcuts によると、

  • M-C-f : move forward one S-expression

  • M-C-b : move backward one S-expression

  • 上記のようにメタキーの入力をするには、Escape キーを押せばいいので、

    1. Escape キーを押す。
    2. C-f または C-b を押す。

    という操作をする。

     

    Escape キーの代替

    追記(2012/08/03): Escape キーは、ホームポジションから遠い位置にある。 キー入力が面倒な場合、AutoHotkey で代替すると良い。

    これにより、

    1. Ctrl + [
    2. Ctrl + f

    の順にキーを入力すると M-C-f と同じ動作になる。 このとき、Ctrl キー押したまま [, f を入力すれば良い。押下したキーを離す必要はない。

     

    5. コードの補完