<code></code> を textile の形式で書いてしまったので org-mode に直す

なぜ気づかなかったのか……。
parent 6f092e1f
......@@ -21,10 +21,10 @@ description: 普段 Scheme を使わないプログラマ向けに SICP を快
私がぱっと思いつくのは下記の3点です。
- SICP では対(pair)というデータ構造を使用する
- Python や Haskell にある @tuple@ とは異なり、Scheme では @pair@ を組み合わせて @list@ という構造を構成する
- @pair@ を組み合わせて @list@ を構成するようになっているプログラミング言語は少ない
- Python や Haskell にある =tuple= とは異なり、Scheme では =pair= を組み合わせて =list= という構造を構成する
- =pair= を組み合わせて =list= を構成するようになっているプログラミング言語は少ない
- Lisp 方言の一つである Clojure はリストを構成するのに pair を使用していない
- Scheme の @pair@ は破壊できる (@set-car!@, @set-cdr!@)
- Scheme の =pair= は破壊できる (=set-car!=, =set-cdr!=)
- Lisp と同じようなリスト構造を扱えるプログラミング言語で、その構成要素の pair を破壊できるプログラミング言語は少ない(筆者は知らない)
- SICP では末尾呼び出しが最適化されることを前提としている
- 末尾呼び出しが最適化されないプログラミング言語では、SICP に紹介されているようなプログラムの書き方をするのはスタイルとして良くない
......@@ -36,7 +36,7 @@ description: 普段 Scheme を使わないプログラマ向けに SICP を快
正直なところ全て些細な問題なのですが、他のプログラミング言語で SICP を読もうとした場合に障壁となるので素直に Scheme を使った方が良いです。
** エディタについて
pair と末尾呼び出しの最適化と @cons-stream@ を除けば SICP では Scheme 特有の特殊な仕組みを必要としません。
pair と末尾呼び出しの最適化と =cons-stream= を除けば SICP では Scheme 特有の特殊な仕組みを必要としません。
よって SICP で解説されるほとんどの言語機能は現代の他のプログラミング言語にもあるものが多く、そこで躓くことはないと思います。
(とくに Ruby や JavaScript といったプログラミング言語を使ったことがあれば、新しいものはほとんどないはずです)
......@@ -57,8 +57,8 @@ description: 普段 Scheme を使わないプログラマ向けに SICP を快
Emacs を使用しない場合は DrRacket がおすすめです。
DrRacket を使うと実質的に選択できる Scheme の処理系が Racket に絞られてしまうのが難点なのですが SICP を読む限りは大きな問題にはならないです。
ただし、Racket の標準の言語(@#lang racket@)では @set-car!@, @set-cdr!@ が存在していないので普通に使うと第3章で詰みます。
@#lang r5rs@ とするか DrRacket の設定を変更して標準の Scheme を使用するように変更する必要があります。
ただし、Racket の標準の言語(=#lang racket=)では =set-car!=, =set-cdr!= が存在していないので普通に使うと第3章で詰みます。
=#lang r5rs= とするか DrRacket の設定を変更して標準の Scheme を使用するように変更する必要があります。
また、Racket には sicp 専用のモードがあるようなのでそちらを使用してもいいかもしれません。
*** 推奨していいのかよく分かっていないエディタ
......@@ -66,7 +66,7 @@ description: 普段 Scheme を使わないプログラマ向けに SICP を快
**** Vim
軽く調べた感じ Vim でも Lisp のプログラムが書けるようです。
@if@ のインデントが Scheme の一般的なスタイルとは違ったので、@lispwords@ 変数から @if@ は取り除いた方がいいかもしれません。
=if= のインデントが Scheme の一般的なスタイルとは違ったので、=lispwords= 変数から =if= は取り除いた方がいいかもしれません。
また、Vim から REPL を起動できるのかといったことについては良く分かっていないので、Vim を使う場合は自己責任でお願いします。
......@@ -85,14 +85,14 @@ description: 普段 Scheme を使わないプログラマ向けに SICP を快
*** 括弧の対応を間違えてしまう
Scheme のコードで @(f a b c)@ というような式が現われた場合、
基本的には @f@ が手続きであれば @a@, @b@, @c@ を渡して @f@ を呼びだすという意味で、
@f@ が特殊形式であれば @(f a b c)@ が @f@ 特有のルールで評価されます。
Scheme のコードで =(f a b c)= というような式が現われた場合、
基本的には =f= が手続きであれば =a=, =b=, =c= を渡して =f= を呼びだすという意味で、
=f= が特殊形式であれば =(f a b c)= が =f= 特有のルールで評価されます。
これだけであれば簡単なのですが例外があって @let@ や @cond@ のような特殊形式の中では括弧をグルーピングのために使用しています。
これだけであれば簡単なのですが例外があって =let= や =cond= のような特殊形式の中では括弧をグルーピングのために使用しています。
このときグルーピングのために使用された括弧の中で手続きを呼び出すような場合には括弧をたくさん書く必要があり、ここで括弧の対応を誤ってしまうという問題が発生しがちです。
たとえば下記のように @let@ の中で括弧の対応を誤ってしまう場合があります(ここでは @let@ についての説明はしません)
たとえば下記のように =let= の中で括弧の対応を誤ってしまう場合があります(ここでは =let= についての説明はしません)
#+BEGIN_SRC
(let ((a (+ 1 2)
......@@ -100,9 +100,9 @@ description: 普段 Scheme を使わないプログラマ向けに SICP を快
(+ a b))
#+END_SRC
これを Scheme に解釈させると、@let@ の構文エラーになるのですが、
これを Scheme に解釈させると、=let= の構文エラーになるのですが、
ぱっと見ただけではどこがおかしいのかを判断するのは困難です。
Scheme 側も @let@ の中でどういった構文エラーが発生しているかまでは伝えることができるのですが、
Scheme 側も =let= の中でどういった構文エラーが発生しているかまでは伝えることができるのですが、
具体的にどう直せばよいのかまでは教えてくれません。
よって正しい対処法を知らないとこのような些細なミスで多くの時間を浪費してしまいます。
......@@ -115,8 +115,8 @@ description: 普段 Scheme を使わないプログラマ向けに SICP を快
(+ a b))
#+END_SRC
@(b (+ 3 4))@ が右にずれてしまいました。
これは @(a (+ 1 2))@ しないといけないのに最後の閉じ括弧を書き忘れてしまっていることが原因です。
=(b (+ 3 4))= が右にずれてしまいました。
これは =(a (+ 1 2))= しないといけないのに最後の閉じ括弧を書き忘れてしまっていることが原因です。
このように、エディタの *自動インデント機能は重要* です。
括弧の対応に関するエラーはほとんど自動インデントで撲滅できるのでうまく活用してください。
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment