とりとめのないことを書いております。
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 )
【racket】REALM OF RACKET 3章まで読みました
前の記事で、REALM OF RACKETはHtDPと変わらないといってましたが、大きな違いがありました。HtDPでは、choose languageでHtDP専用の言語を選択しなければならないのですが、REALM OF RACKETではちゃんと#lang racketしていました。

つまり、REALM OF RACKETはracket言語の入門書であるといえます。

また、この本には分からない英単語(特に形容詞)が出てきますが、非常に丁寧な説明なので読み飛ばせます。つまり、あまり辞書を引かなくても読める本なので、とにかく英語の本を1冊読みたい人にはおすすめかもしれません。

3章では、RacketのListとStructureについて解説していました。StructureはCの構造体とほぼ同じ概念なのですが、Schemeにはない概念だったと思います。RacketはCやJavaに似たような仕組みが沢山あって、それがRacketを使いやすくしているのですが、SchemerにとってはLisp感なくてがっかりさせてしまうのかもしれません。CやJavaの仕組みというのは、わかりやすいのですが、冗長でもあります。

また、Structureは、1個定義するとフィールドの数だけアクセサを定義します。これがどことなくpythonぽくていやなのです。慣れればなんということもないのでしょうけれども。

3章で特出すべきところとして、Racketのコメント形式について触れていました。Racketには、行コメント(line comment), ブロックコメント(block comment), S式コメント(S-expression comment)の3つがあります。

; 行コメント
; 行コメント
; 行コメント


#|
ブロックコメント

#| ブロックコメントは入れ子にできます |#

ブロックコメントの終わり
|#


#;(string-append
"S式コメント"
""
"ソースコードをスイッチさせて実行させたい時、"
"#;をS式の前に入れるとそのS式全部をコメントアウトできるようですよ")

(define (loop num)
  (unless (= num 10)
    ; S式コメントはローカル定義でも有効です。
    #;(display (string-append
              (number->string num)
              "ですよ\n"))
    (loop (add1 num))))


[PR]
by tempurature | 2015-12-04 03:25 | scheme
【racket】REALM OF RACKETの中身
REALM OF RACKETを2章までがんばって読んで、もしやと思い、残りのページをペラ見すると、HtDPとほぼ同じ内容であることがわかりました。

HtDPは、Web上に公開されているので、それを見ればいいと思います。


racketは、子供にプログラミングを教えるにはどうすればよいかという観点から始まっているようです。なので、プログラミングのつまづきがなくなるように、初心者に非常に丁寧に説明し、かつ、教材のようなライブラリも充実しています(ティーチパック)。

しかし、実用面で考えると、racketを実用的に使うための書籍がないことにがっかりします。公式のドキュメンテーションよりわかりやすい解説がないのです。

racketはLGPLであるし、どことなくアカデミック臭がします。

nutshellの使い勝手が半端ないし、haskellにしようかな〜


[PR]
by tempurature | 2015-12-03 00:19 | scheme
【racket】ゲス乙女ならぬ・・・
REALM OF RACKETのまえがき(Preface)、xvi項に次の文言があります。

[Can I Skip Chapters?]

You might think you can skip ahead and save Chad right away, but we highly recommend that you read this book from front to back. Each chapter depends on the knowledge you learned from the previous one, and we don't want you to miss out on any of Chad's adventures.

<<ブログ主による訳>>

[飛ばし読みできる?]

とっとと前に進んでチャド(この本の主人公)を救いたいと思うかもしれない。けれどもこの本を全部通しで読むことを強くおすすめする。各章はその前の章の知識を前提としているし、チャドの冒険をどれも見逃さないで欲しいのだ。


なんですけど、第2章のテーマが「The Guess My Number Game」。恐ろしく飛ばしてぇぇぇ〜〜〜


ちなみに、1章まではこんな感じです。

・Introduction : Lispうんちく。おもろい
・Chapter 1 : なんとなく使っていたDrRacketについてのまじめな説明。読む必要は、う〜ん。短いし読めば〜


[PR]
by tempurature | 2015-12-02 21:04 | scheme
Dr. Racketって...
Dr. Racketって、「ラケット医師」って意味じゃなくて、「ラケット博士」って意味だったんですね。REALM OF RACKETのDr. Racket像を見て気付きました。
[PR]
by tempurature | 2015-12-01 23:09 | scheme
【racket】英単語学習ソフトを作ってみた
せっかく英語の本を読んでいるので、英単語を学習するための簡単なソフトを作ってみました。

#lang racket

(display "Welcome to English word quiz!!\n")

(define *database*
  `("freshmen" "新人、一年生"
    "sophomore" "二年生"
    "expedition" "遠征"
    "novice" "初心者、未熟者"
    "engage" "従事する、携わる"
    "inquisitive" "そんなに根掘り葉掘り聞きたがるな/Don't be so ___."))

(define (loop rest)
  (unless (null? rest)
    (display (second rest))
    (if (equal? (read-line) (first rest))
        (display "Good!!\n")
        (display (string-append "Boo!! " (first rest) "\n")))
    (loop (cddr rest))))
(loop *database*)

(display "It's end. Good Job!!")


[PR]
by tempurature | 2015-12-01 22:10 | scheme
【racket】REALM OF RACKETを入手しました
c0364169_20384572.jpg
LAND OF LISPと同じ人が書いた本らしいです。とはいえ、racketの中心メンバーが数多く共著に名を連ねています。本の挿絵もLAND OF LISPとは違うのが入っていて、楽しめるようになっています。

本の巻頭には、なんと、ジョン・マッカーシーの似顔絵がドーン!!

「プログラミングGauche」と「Learn You a Haskell for a Great Good!!」と、どれ読むかすごく悩みます。

(ちなみにrealmはレルムと読むらしいですよ)

[PR]
by tempurature | 2015-12-01 20:56 | scheme
【racket】テキストエディタ画面を作成する
racketでテキストエディタ画面を表示するプログラムを作成しました。

c0364169_23311554.png
フォントは「MS ゴシック, 12pt」です。racketでフォントを設定するのは、苦労しましたがなんとかできました。

racoでコンパイルすると、exeファイルを作成してくれますが、実行ファイルのサイズが9MBにもなってしまいました。

【ソースコード】

#lang racket

(require racket/gui)

; definitions

(define *app-name* "textbox")

; body

(define style-list (new style-list%))
(define delta (make-object style-delta% 'change-size 12))
(send delta set-face "MS Gothic")
(send style-list new-named-style "Standard"
      (send the-style-list basic-style))
(define my-standard-style (send style-list find-named-style "Standard"))
(send my-standard-style set-delta delta)

(define frame (new frame% [label *app-name*] [width 300] [height 300]))
(define canvas (new editor-canvas% [parent frame]))
(define text (new text%))
(send text set-style-list style-list)
(send canvas set-editor text)

(send frame show #t)

[PR]
by tempurature | 2015-11-23 23:39 | scheme
【Gauche】rangeのテストコードを書いてみた
プログラミングGaucheの10章がユニットテストのトピックだったので、rangeのテストコードを書いてみました。手書きで書けば10分で済んだものの、横着してスクリプトで書いたので、3〜4時間かかってしまいました。

【テストコードを出力するスクリプト】

#!/bin/sh -f

function p { # in case of Cygwin Bsh -> Windows Gauche
  printf "%s" "$1"
  shift
  while [ -n "$1" ]; do
    printf " %s" "$1"
    shift
  done
  printf "\r\n"
}

function test_range {

  ITEM='range('$1
  if [ -n "$2" ]; then ITEM=$ITEM', '$2; fi
  if [ -n "$3" ]; then ITEM=$ITEM', '$3; fi
  ITEM=$ITEM')'

  PYINP='python3 -c '"'"'print(list('$ITEM'))'"'"

  PYOUT=`echo $PYINP | sh`
  SCHOUT='(list '`echo $PYOUT | sed -r 's/(\[|\]|,)//g'`')'

  SCHINP='(range '"$1"
  if [ -n "$2" ]; then SCHINP=$SCHINP' '"$2"; fi
  if [ -n "$3" ]; then SCHINP=$SCHINP' '"$3"; fi
  SCHINP=$SCHINP')'
  
  p '(test* "'$ITEM' [Python 3.4 Documentation]"'
  p '       '$SCHOUT
  p '       '$SCHINP')'
  p ''

}

p ";; -*- coding: shift_jis -*-"
p ""
p "(use gauche.test)"
p '(test-start "range.scm")'
p ""
p '(load "./range")'
p ""
test_range 10
test_range 1 11
test_range 0 30 5
test_range 0 10 3
test_range 0 '-10' '-1'
test_range 0
test_range 1 0
p ""
p "(test-end)"

【出力されたテストコード】

;; -*- coding: shift_jis -*-

(use gauche.test)
(test-start "range.scm")

(load "./range")

(test* "range(10) [Python 3.4 Documentation]"
       (list 0 1 2 3 4 5 6 7 8 9)
       (range 10))

(test* "range(1, 11) [Python 3.4 Documentation]"
       (list 1 2 3 4 5 6 7 8 9 10)
       (range 1 11))

(test* "range(0, 30, 5) [Python 3.4 Documentation]"
       (list 0 5 10 15 20 25)
       (range 0 30 5))

(test* "range(0, 10, 3) [Python 3.4 Documentation]"
       (list 0 3 6 9)
       (range 0 10 3))

(test* "range(0, -10, -1) [Python 3.4 Documentation]"
       (list 0 -1 -2 -3 -4 -5 -6 -7 -8 -9)
       (range 0 -10 -1))

(test* "range(0) [Python 3.4 Documentation]"
       (list )
       (range 0))

(test* "range(1, 0) [Python 3.4 Documentation]"
       (list )
       (range 1 0))


(test-end)

[PR]
by tempurature | 2015-11-19 21:25 | scheme
【Gauche】名前付きletとmatchを使ってみた
schemeをやるとコードがきれいになるみたいだよ。へぇ


ぐさっとくる一言。どういう文脈で語られているかすごく気になります。

ということで、僕の好きなreverseとrangeを習いたての文法で書いてみました。

【ソースコード】

;; -*- coding: shift_jis -*-

(use util.match)

(define (reverse lis)
  (let loop ((rest lis) (res '()))
    (if (null? rest) res (loop (cdr rest) (cons (car rest) res)))))

(define (range . options)
  (match options
    [(end) (range 0 end 1)]
    [(start end) (range start end 1)]
    [(start end step)
     (reverse   ; reverseは線形時間だから問題ない(笑)
       (let loop ((i start) (res '()))
         (if (>= i end) res (loop (+ i step) (cons i res)))))]))

[PR]
by tempurature | 2015-11-12 22:39 | scheme
【Gauche】ソースコードをexciteブログの形式に変換するスクリプト
Windowsのメモ帳で作成したソースコードをexciteブログに貼り付ける時に、前に作ったbashスクリプトでは文字化けするので、Gaucheで作りなおしました。

【ソースコード】

#! /usr/bin/env gosh
;; -*- coding: shift_jis -*-

(define (make-loop in)
  (define (loop)
    (let ((line (read-line in)))
      (unless (eof-object? line)
        (print (regexp-replace-all* line #/\&/ "\&amp;"
                                         #/ /  "\&nbsp;"
                                         #/</  "\&lt;"
                                         #/>/  "\&gt;"
                                         #/(.*)/ "\\1<br\/>"))
        (loop))))
  loop)

(define (main args)
  (let ((in (open-input-file (cadr args) :if-does-not-exist #f
                                         :encoding "SHIFT_JIS")))
    (if (not in) (exit))
    (print "<div class=\"code\" style=\"font-family:monospace;\">")
    ((make-loop in))
    (close-port in))
  0)

[PR]
by tempurature | 2015-11-12 21:50 | scheme