とりとめのないことを書いております。
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
外部リンク
ファン
記事ランキング
ブログジャンル
画像一覧
<   2015年 11月 ( 15 )   > この月の画像一覧
【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
bash上で (exit) と入力しても、何も起きなかった
そりゃそーかー



[PR]
by tempurature | 2015-11-11 22:57 | scheme
GaucheをWindowsで使う
Gaucheの本家では、WindowsにおいてはGaucheをEmacs環境上で使用することを強く推奨しています。けれども私はEmacsが嫌いです。

以下では私なりのGauche環境を紹介します。

i) Widowsインストーラパッケージ(msi)でGaucheをインストールする
ii) Cygwinをインストールする
iii) .bashrc等に「alias go='gosh -i -I .'」の一行を追加する
iv) Gaucheのソースコードを作成・編集する時は、「notepad <filename>」とCygwinのコマンドラインに入力する
v) Gaucheのソースコードの先頭に必ず「;; -*- coding: shift_jis -*-」を追加する
vi) goshで変な動作になったらすぐ[Ctrl+C]で抜ける

(iv)でnotepadを使うのは、改行コードがCR+LFであることを保証するためです。(i)でCygwin上でGaucheをコンパイルしないのは、それが素人には難しいからです。また、コマンドプロンプト上でgoshを起動しても、日本語が文字化けします。(iii)のおまじないで、Gaucheがracket並に使い勝手が良くなるはずです。

以上です

【2015.11.22 追記】
上記の設定だと、(char-alphabetic? #\あ)が#tになる不具合があります。
Cygwinの代わりにgit Bashで試しても同じでした。

ちなみに、コマンドプロンプトとPowershellでは、(char-alphabetic? #\あ)が#fとなり正しいのですが、ターミナルの文字コードをutf-8にできないのでgoshの文字化けを解消できないです。


[PR]
by tempurature | 2015-11-11 22:48 | scheme
【racket】世界のナベアツのネタをプログラムで再現しました
「プログラミングGauche」という本を中古で購入しました。
今は絶版になっているようです。

その本の、68ページの練習問題に触発されて、世界のナベアツのネタをプログラムで再現してみました。

[ソースコード]

#lang racket

(define (hiragana-exp num)
  (cond ((<= num 10)
         (list-ref '("ぜろ" "いち" "に" "さん" "し" "ご"
                     "ろく" "なな" "はち" "きゅう" "じゅう") num))
        ((<= num 19) (string-append "じゅう" (hiragana-exp (- num 10))))
        ((and (<= num 99) (zero? (remainder num 10)))
         (string-append (hiragana-exp (quotient num 10)) "じゅう"))
        ((<= num 99) (string-append (hiragana-exp (* (quotient num 10) 10))
                                    (hiragana-exp (remainder num 10))))
        ((= num 100) "ひゃく")
        ((and (<= num 999) (zero? (remainder num 100)))
         (string-append (hiragana-exp (quotient num 100)) "ひゃく"))
        ((<= num 999) (string-append (hiragana-exp (* (quotient num 100) 100))
                                     (hiragana-exp (remainder num 100))))
        (#t "たくさん")))

(define hiragana-matrix
  '("あかさたなはまやらわん"
    "いきしちにひみ り  "
    "うくすつぬふむゆる  "
    "えけせてねへめ れ  "
    "おこそとのほもよろ  "))

(define (stressed-hiragana-exp num)
  (let* ((hexp (hiragana-exp num))
         (tail (~a (string-ref hexp (sub1 (string-length hexp))))))
    (string-append
      hexp
      (cond
        ((equal? tail "ん") "っ")
        ((regexp-match tail (list-ref hiragana-matrix 0)) "ぁ")
        ((regexp-match tail (list-ref hiragana-matrix 1)) "ぃ")
        ((regexp-match tail (list-ref hiragana-matrix 2)) "ぅ")
        ((regexp-match tail (list-ref hiragana-matrix 3)) "ぇ")
        ((regexp-match tail (list-ref hiragana-matrix 4)) "ぉ")
        (#t "っ")))))

(define (nabeatsu-function num)
  (or (= (remainder num 3) 0)
      (regexp-match "3" (~a num))))

(define (nabeatsu-print num)
  (if (nabeatsu-function num) (stressed-hiragana-exp num) (~a num)))

[出力例]

> (string-join (map nabeatsu-print (range 1 100)) " ")
"1 2 さんっ 4 5 ろくぅ 7 8 きゅうぅ 10 11 じゅうにぃ じゅうさんっ 14 じゅうごっ 16 17 じゅうはちぃ 19 20 にじゅういちぃ 22 にじゅうさんっ にじゅうしぃ 25 26 にじゅうななぁ 28 29 さんじゅうぅ さんじゅういちぃ さんじゅうにぃ さんじゅうさんっ さんじゅうしぃ さんじゅうごっ さんじゅうろくぅ さんじゅうななぁ さんじゅうはちぃ さんじゅうきゅうぅ 40 41 しじゅうにぃ しじゅうさんっ 44 しじゅうごっ 46 47 しじゅうはちぃ 49 50 ごじゅういちぃ 52 ごじゅうさんっ ごじゅうしぃ 55 56 ごじゅうななぁ 58 59 ろくじゅうぅ 61 62 ろくじゅうさんっ 64 65 ろくじゅうろくぅ 67 68 ろくじゅうきゅうぅ 70 71 ななじゅうにぃ ななじゅうさんっ 74 ななじゅうごっ 76 77 ななじゅうはちぃ 79 80 はちじゅういちぃ 82 はちじゅうさんっ はちじゅうしぃ 85 86 はちじゅうななぁ 88 89 きゅうじゅうぅ 91 92 きゅうじゅうさんっ 94 95 きゅうじゅうろくぅ 97 98 きゅうじゅうきゅうぅ"


[PR]
by tempurature | 2015-11-01 20:40 | scheme