Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
What's new
6
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Switch to GitLab Next
Sign in / Register
Toggle navigation
W
www.tojo.tokyo
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Locked Files
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Iterations
Merge Requests
0
Merge Requests
0
Requirements
Requirements
List
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Test Cases
Security & Compliance
Security & Compliance
Dependency List
License Compliance
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Package Registry
Container Registry
Analytics
Analytics
CI / CD
Code Review
Insights
Issue
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Masaya Tojo
www.tojo.tokyo
Commits
42cda570
Verified
Commit
42cda570
authored
Jun 11, 2020
by
Masaya Tojo
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
<code></code> を textile の形式で書いてしまったので org-mode に直す
なぜ気づかなかったのか……。
parent
6f092e1f
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
16 additions
and
16 deletions
+16
-16
posts/before-sicp-about-scheme.org
posts/before-sicp-about-scheme.org
+16
-16
No files found.
posts/before-sicp-about-scheme.org
View file @
42cda570
...
...
@@ -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))=
しないといけないのに最後の閉じ括弧を書き忘れてしまっていることが原因です。
このように、エディタの *自動インデント機能は重要* です。
括弧の対応に関するエラーはほとんど自動インデントで撲滅できるのでうまく活用してください。
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment