Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

2.2.2 Hierarchical StructuresをPythonでやってみた

SICP2.2.2 Hierarchical Structures の Mapping over trees あたりを Python でやってみた

scheme
;2.2.2  Hierarchical Structures
;Mapping over trees
(define (scale-tree tree factor)
  (cond ((null? tree)
         ())
        ((not (pair? tree))
         (* tree factor))
        (else (cons (scale-tree (car tree) factor)
                    (scale-tree (cdr tree) factor)))))
(scale-tree (list 1 (list 2 (list 3 4) 5) (list 6 7))
            10)
;(10 (20 (30 40) 50) (60 70))

(define (scale-tree tree factor)
  (map (lambda (sub-tree)
         (if (pair? sub-tree)
             (scale-tree sub-tree factor)
             (* sub-tree factor)))
       tree))
(scale-tree (list 1 (list 2 (list 3 4) 5) (list 6 7))
            10)
;(10 (20 (30 40) 50) (60 70))
python

scheme の pair?の代用にとりあえず isinstance()をつかってみた。結構ハマった(´・ω・`)
type() でなくてisinstance() 推奨なのね...

#2.2.2  Hierarchical Structures
#Mapping over trees
def scale_tree(tree, factor):
    if not tree:
        return []
    if not isinstance(tree, list):
        return tree * factor
    return [scale_tree(tree[0], factor)] + scale_tree(tree[1:], factor)
print scale_tree([1,[2,[3,4],5],[6,7]], 10)
#[10, [20, [30, 40], 50], [60, 70]]

def scale_tree_lambada(tree, factor):
    return map(lambda sub_tree: isinstance(sub_tree, list) == True
               and scale_tree_lambada(sub_tree, factor) or sub_tree * factor,
               tree)
print scale_tree_lambada([1,[2,[3,4],5],[6,7]], 10)
#[10, [20, [30, 40], 50], [60, 70]]

う〜む、ややこしくなってきたかも。MITで使われてるだけはある?(||゚Д゚)
っていうか、まだ2章の初めなんだけどなぁ...何なの?馬鹿なの私?
予定では3章でわけわからなくなって(飽きてきて?)、4章あたりでサジ投げかける的な展開になると踏んでたのだが。甘く見てたかな(´・ω・`)





なぜC言語は習得が困難だと思うのか3つの理由

なぜ、私はC言語を学習することに対して躊躇してしまうのか。『C言語撃退講座 ~K&Rは置いて、俺の話を聞け』を読んで思ったことなど。(ちなみにCの経験なし)


C言語撃退講座』「なぜ習得が困難か(p44)」の自分的要約

  1. 難しいのは言語の理解より、レジスタ・メモリ・ビットやバイトの理解。
  2. 言語仕様による開発効率の低下による難易度の上昇。(特定用途に特化した言語に比べて)
  3. 言語と(拡張)ライブラリとの区別がついてないから。


それ以前に自分的困難な(躊躇する)理由は

  1. Cはプログラムが長い
  2. やっぱりポインタ?
  3. お固い

の3つだと思われる。


1.Cはプログラムが長い

たとえばHellow World!でさえ(Wikipediaから引用)

C

# include <stdio.h>
 
int main(void) {
 printf("Hello, world!\n");
 return 0;
}

Python

print "Hello, world!"

PythonならGUIでも短い。
(ウインドウを開いてHello World!の表示。The GITS Blog » Python GUI programming platforms for Windowsから引用、若干削った)

import Tkinter as Tk
la = Tk.Label(None, text='Hello World!')
la.pack()
la.mainloop()

CのGUI sample見つけられなかったけど、これよりかなり長くなるはず(偏見?)
やっぱり短く簡潔なものが好き。


2.やっぱりポインタ?

C言語撃退講座』の「第5章 さあ。いまこそ最終ボス、ポインタ打倒のとき」でポインタは難しいものではないような説明があるけど、p126にある

ほとんどの言語で異常終了するところで、…我らがC言語の場合は、機嫌よく、正常に誤動作してしまうのだよ。

が最もC言語を躊躇してしまう理由かも。
Pythonとかの対話式みたいな速攻で実行と結果をお手軽に得られる環境がC言語にない(知らない)
よく「コードを読み、そして書け」的な教訓?があり、そこには実行することも含まれてるはず。
理解していない上にエラー(異常終了)が出なければ、気がつかずにハマりまくりになりそう。特にポインタまわりで(根拠無し)。

3.お固い

Cは冗談が通じない真面目な人って感じ。PythonRubyPerlなどのモダンな言語は一緒に合コンに行っても楽しめそうな感じ?(妄想)



#雑感など


基本的にCに対する拒否感は、『主観による偏見』が大きいのかもしれない。
C言語撃退講座 ~K&Rは置いて、俺の話を聞け』はその壁をいくらか取り除いてくれるかもしれない。実際、私は興味をCに持てた。

それから、

プログラミング言語の習得とは?

そもそも、どのレベルでそのプログラミング言語を「習得した」と言えるのだろう?
本書の「第4回 そもそもどういう状態になればC言語を習得したと言えるのか?(p49)」にひとつの回答がある。

「参考書やオンラインヘルプを閲覧することなしに制御構文が記述できる」
(ライブラリや、フレームワークが提供する関数の使い方ではない)

Pythonではよくクイックリファレンスライブラリリファレンスを参照するけど、制御構文の記述できる..かも。習得できる感じはないけど、脱初心者できてる?(´・ω・`)


自分的に未知なCの書き方が面白く感じた

p215にある『K&Rプログラミング言語C ANSI規格準拠)』の速度優先を推奨してるというsample code

読みやすい版の例(p216)
著者の方から(・∀・)トラバ頂いていたので修正。
(今日、気付いた(||゚Д゚)。楽天が運営するポータルサイト : 【インフォシーク】Infoseek 216ページ二番目のコード)

void strcpy (char *s, char *t)
{
    int i;
    for (i=0; i<=strlen(t); i++)
        s[i] = t[i];
}

K&R推奨の速度優先版(p215)

void strcpy (char *s, char *t)
{
    while (*s++  = *t++)
        ;
}

ポインタ使ったやり方これ?
これ見てなぜかCというかK&Rにちょっと興味がわいた。
本屋で立ち読みした限り『独習C 第4版』が良さげだったが...どうしよう(´・ω・`)
その前にSICPも終わってないし(||゚Д゚)
他にもいろいろ...