とりとめのないことを書いております。
by tempurature
カテゴリ
全体
プログラミング
scheme
verilog
未分類
以前の記事
2016年 04月
2016年 03月
2016年 02月
2016年 01月
2015年 12月
2015年 11月
2015年 10月
2015年 09月
2015年 08月
2015年 07月
2015年 06月
2015年 03月
お気に入りブログ
PHPで競技プログラミング
メモ帳
最新のトラックバック
ライフログ
検索
タグ
その他のジャンル
ブログパーツ
最新の記事
情報処理技術者試験 お疲れ様..
at 2016-04-17 18:55
基本情報技術者試験 平成27..
at 2016-04-14 04:48
基本情報技術者試験 平成27..
at 2016-04-13 23:03
苦い薬(ハーブ、サプリメント..
at 2016-04-09 14:03
「おバカ度チェックリスト」を..
at 2016-03-24 09:54
外部リンク
ファン
記事ランキング
ブログジャンル
画像一覧
カテゴリ:scheme( 54 )
SICP Exercise 3.17 の解答
この問題のヒントが気に入らなくて、別回答を考えました。

(define (flatten lst)
  (cond ((null? lst) '())
        ((not (list? lst)) '())
        (#t (append (list lst)
                    (flatten (car lst))
                    (flatten (cdr lst))))))
(define (filter proc lst)
  (cond ((null? lst) '())
        ((proc (car lst)) (cons (car lst) (filter proc (cdr lst))))
        (#t (filter proc (cdr lst)))))
(define (uniq lst)
  (define (iter res rest)
    (if (null? rest)
        res
        (let ((current (filter (lambda (x) (eq? x (car rest)))
                               (cdr rest))))
          (if (null? current) (iter (cons (car rest) res) (cdr rest))
                              (iter res (cdr rest))))))
  (iter '() lst))
(define (count-pairs x)
  (length (uniq (flatten x))))

[PR]
by tempurature | 2015-08-23 15:13 | scheme
とあるSICP 3章の環境の説明図の簡単なバージョン
SICPで⦿⦿(ニップルマーク?)が出てきた時、最初これの意味がわかりませんでした。なのでSICPの説明図より簡単な場合について作図してみました。合ってなかったらごめんなさい。

c0364169_21311784.png

<ソースコード>

(define (add a b) (+ a b))
(define (make-add-proc a)
(define (dispatch b) (add a b))
dispatch)
(define add-10 (make-add-proc 10))


[PR]
by tempurature | 2015-08-22 21:31 | scheme
SICP ex.3.9の代わりに変なコード書いてみた
問題3.9が例のごとく面倒な作図問題で、環境の話はDr. RacketをREPLしているうちになんとなく理解していたので、応用問題を自分で考えました。

Q. 自分自身を書き換える手続きを定義せよ。

A.
(define (f x) #f)
(let* ((f1 (lambda () #f))
(f2 (lambda () (set! f f1) 2)))
(set! f1 (lambda () (set! f f2) 1))
(set! f f1))

または
(define (f)
  (define (f1) (set! f f2) 1)
  (define (f2) (set! f f1) 2)
  (f1))


[PR]
by tempurature | 2015-08-15 23:26 | scheme
【racket】電卓サンプル
racketで電卓サンプル作りました。ソースコードは240行あります。

c0364169_01053595.png
<github>



[PR]
by tempurature | 2015-08-14 01:07 | scheme
【racket】graphing-calculator
racketで定石のプログラムを書きたいということで他のプログラマのコードを参考にしていきたいです。

電卓プログラムを探していましたが、面白いのを見つけましたので紹介します。

c0364169_00104549.png
関数を入力すると、グラフをプロットしてくれるプログラムです。
Makefileからビルドするために、Ubuntuで実行しました。

<github>

<作者>
Spencer Florence

<ソースコードの行数>
2 calc.rkt
43 graph.rkt
125 gui.rkt
84 parser.rkt
254 total



[PR]
by tempurature | 2015-08-03 00:17 | scheme
Ubuntu 15.04にracketをインストール
Dr. RacketはUbuntuソフトウェアセンターに登録されているのですぐにインストールすることができます。
c0364169_15043661.png
Dr. Racketの画面。Windows版と変わりません。
c0364169_15073129.png
メインウィンドウはWindows版と変わらないのですが、
アイコンがよく見るとフォルダ。残念です。


racoというコマンドも端末上からすぐ使うことができます。

c0364169_15130174.png



[PR]
by tempurature | 2015-08-02 15:14 | scheme
【恐怖】Dr. Racketの起動画面
Racketを使っている人には、Dr. Racketの起動画面はおなじみだと思います。

c0364169_20542563.png
でも、このウィンドウにカーソルを合わせると・・・

c0364169_20545702.png
ギャャャャャァァァーーー


lisperあたまおかしいって、ホントかもしれないです。


[PR]
by tempurature | 2015-07-30 20:58 | scheme
どうしてracketは流行らないのか?
私のより新しい意見はこちらになります。



racketは、PLTというグループが開発するlisp系言語です。racketはもともとPLT schemeという名前で、scheme実装の1つでしたが、schemeとCommon Lispを踏まえた新しいlispを作るという目標のもとに分化しました。

racketの1番の特徴は、windows, macOS, linuxで使えるGUIベースの開発環境 Dr. Racketであり、Common Lisp, Schemeではこれほど簡単に導入することができる環境は私の知る限りではないです。

とはいえ、日本ではracketはほとんど知られておらず、アメリカでもCommon Lisp, Schemeほどの人気はない言語です。

現在私が知る限りにおいて、なぜracketが流行っていないのかを考えてみます。


< 1 > racketの実装は実行速度が遅い

lispのコミュニティの中では、schemeに比べてracketの実行速度が遅いという評判です。実際そうなのか私自身把握しているわけでなないですが、そういう書き込みは見ています。

< 2 > 枯れた言語ではない

C, scheme, Common Lispなどは古い言語なので、ドキュメントやライブラリが充実しています。また、仕様変更が頻繁におこらないので、レガシー資産を使うことができ、また、自分の書いたコードを10年後にも使えるだろうという安心感もあります。

pythonやphpなどは人気のある言語ですが、現在も言語の仕様変更が行われているのでコードの寿命が短いという問題があります。racketも生まれたばかりの言語なので同様の問題が発生します。

< 3 > lispの慣用とは異なる

racketはschemeとほぼ同じような言語仕様ですが、scheme, Common Lispとは相容れないような違いがあります。

・識別子(identifier)は大文字と小文字を区別する

scheme, Common Lispでは大文字・小文字を区別しないので、lisperが大文字の名前と小文字の名前を使っているracketコードを見ると混乱します。

・文字コードはunicode

schemeやCommon Lispでは独特の文字列処理体系を持っていますが、racketではpythonやDに似たunicodeによる文字列処理を行っています。

これらの特徴は、lispを他の言語と併用しようと考えた場合には長所となります。racketはモダン言語の1つとしてのポテンシャルは持っていると思います。

< 4 > 実装の種類が少ない

scheme, Common Lispは商用、非商用の実装が多数あり、実行速度や拡張機能などのニーズで色々な実装を試すことができます。racketはPLTで配布している実装だけなので、素人向けではありますが、プロ向けではないのだと思います。



racketはscheme, Common Lispに比べて日本語の情報が少ないですが、導入の手軽さでは群を抜いており、GUI, webサーバー, 3Dグラフィックスのライブラリも一通り揃ってますので、趣味のプログラミング用途では一押しです。

racketが有用であるかどうかは難しいところですが、racketの日本語の情報を提供することで、多くの人が言語に関してより正しい選択ができるようにしていけたらと考えています。


[PR]
by tempurature | 2015-07-26 16:08 | scheme
racketのチュートリアルをやっていて
racketのWeb Applications in Racketというチュートリアルに取り組んでいます。
その中でサンプルコードを何度もupdateしているので、私も何度もそれらのコードを手打ちしているのですが(習わぬ経をなんとかというやつです)、一番最初のstruct定義のところでチュートリアル作者と私の間で感性が違うみたいです。

; チュートリアル作者(Danny Yooさん)

(struct blog (posts) #:mutable)
(struct post (title body))

; ブログ主(tempurature)

(struct post (title body))
(struct blog (posts) #:mutable)

きっとDannyさんが英語圏の人間で、私が日本人だからなのでしょう。はじめに結論ありきといいますが、あれはトップダウン的で、説明してから最後に結論を持ってくるのはボトムアップ的な考え方なのでしょう。

関係ないですが、素人の人(エグゼクティブなど)にとって一番大事なのは、目的なのでトップダウン的な考え方をするのかもしれません。専門家にとって一番大事なのは技術なので、ボトムアップ的な考え方をするのでしょう。
(ホンマでっかTVの評論家とか、ボトムアップの典型かと)


[PR]
by tempurature | 2015-07-25 04:59 | scheme
【racket】set!-valuesの例
set!-valuesの例

(define winner "men")
(define loser "women")
(define (swap!) (set!-values (winner loser) (values loser winner)))
(define (report) (string-append winner " beat " loser "."))

> (report)
"men beat women."
> (swap!)
> (report)
"women beat men."

[PR]
by tempurature | 2015-07-24 00:03 | scheme