頭が上手く回るようになるまで小さな問題をたくさん解く。 その過程で新しいことに気づけたらいいな。 計算部分だけ。golferではないのでそんなに短くない。 haskellなどにあるasパターンを使う方法はないのかな? せっかく、matchを使っているのにも関わらずcdrとかcddrとやっているのは不思議な感じがする。 xs@(y . z .rest)とするとsymbolの解析もしなければいけなくなってしまうのか。 asパターンのようなものが使えないのはしかたがないことなのかもしれない。 (use srfi-1) (use util.match) (define (scorer seqs) (define (update x scores) (cons (+ x (car scores)) scores)) (define (end scores) (cdr (reverse scores)
循環や共有構造を持つS式 循環や共有構造を持つS式の表現は、srfi-38で決められている。 この表記はCommon Lispから取ったもので、たとえば次の2つの式: (let ((x (list a))) (set-cdr! x x) x) (let ((x (cons 'a 'b))) (cons x x)) によって作られる構造は、それぞれ次のように記される。 #0=(a . #0#) (#0=(a . b) . #0#) #n= でもってオブジェクトにラベルをつけ、 #n# で参照する Gaucheは、version 0.7.1現在、write* による表示のみサポートしているが、 読み込みはサポートしていない。 近いうちにサポートしたいので、ここで色々考えてみる。 問題点 - srfi-10 vs srfi-38 循環リストの読み込みは、使えるデータ型が決まっていれば難しくない。
Gaucheで、 (map (lambda (x) (* x x)) '(1 2 3)) をcutを使うなら、どう書けばいいんだろう。 cut内で特定の引数を2回以上使いたいってことなんだけど。 (let ((sq (lambda (x) (* x x)))) (map (cut sq <>) '(1 2 3))) ;;pa$を使えばこう ;;(map (pa$ sq) '(1 2 3))) うーん。。。 たとえば「引数の2番目を2回使う」というのをcutだけで表現できないかな。 正規表現の$1みたいなのがあればいいんだけど。 おとなしくlambda使えばいいか。 あとGaucheにはHaskellの$があるらしい。 http://d.hatena.ne.jp/SaitoAtsushi/20080803/1217772372 http://practical-scheme.net/wili
Gauche には $ というマクロがこっそり入っている。 まだ改良の余地があると考えているらしく、ドキュメントにはまだ記載されていない。 Haskell の $ をヒントにしたそうで、具体的には以下の例のとおりに展開される。 ($ f a b c) => (f a b c) ($ f $ g a b c) => (f (g a b c)) ($ f $ g $ h a b c) => (f (g (h a b c))) ($ f a $ g b $ h c) => (f a (g b (h c)))インデントが深くならないというのはあるにしても、記述が短くなるわけでもなく、便利な場面があるか私は疑問に感じていた。 ところが、「どう書く?org」で出題されていた「文字列に含まれる単語の最初の文字を大文字にする」という問題を解こうとして $ を使う機会があり、考えが変わった。 まず、私が書い
Gaucheの拡張モジュールdyncompをリリースしました。このライブラリを使うと、Gaucheのコードの中でCの関数が定義できるようになります(PerlのInline::Cみたいなモジュールです)。 メリットとして、以下のものがあります。 Schemeのコードの中に埋め込めるのでメンテナンスが簡単 コンパイラとしてTiny C Compilerを使っているのでコンパイル速度も速い Cといってもgauche.cgen.ciseを使ったS式表現なので、C風の構文アレルギーの方でも安心して使える デメリットとしては、以下のものがあります。 現状Linuxでしか動かない*1 読めないヘッダファイルがある(GCCの機能に依存しているものとか) 構文がSchemeに似ているのでコードを書いていると混乱する 以下はマンデルブロ集合の計算でベンチマークをとった結果です (CPUはPentiumM 2.
Gauche には extended-pair というものがあります。普段使っている分には気づきませんが実は裏で extended-pair はひっそりと活躍をしています。 早速触ってみましょう。以下のようなコードを書いて exp.scm と名付けました。 (define-macro (import-only module . syms) `(begin ,@(map (lambda (sym) `(define ,sym (with-module ,module ,sym))) syms))) (import-only gauche.internal extended-pair? extended-cons pair-attribute-get pair-attribute-set! pair-attributes) (let1 p '(1 2 3 4) (write p) (print
木構造が与えられる。 := ( ...) という構造。 これから、子→親の対応を表すalistを作る手続きを書け、というもの。 http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a%e3%83%aa%e3%82%b9%e3%83%88%e5%87%a6%e7%90%86#H-ne4pu7 この問題をやってみた (use util.match) (define *tree* '(Root (Spine (Neck (Head)) (RClavicle (RUpperArm (RLowerArm (RHand)))) (LClavicle (LUpperArm (LLowerArm (LHand))))) (RHip (RUpperLeg (RLowerLeg (RFoot)))) (LHip (LUpperLeg (LLowerLeg
はてなダイアリ以外にもはてなが提供しているサービスはいくつかある。はてなアンテナやはてなブックマークだ。で、そのへんに関連する情報をXML-RPCを用いて問合せするAPIがあって、「被ブックマーク合計数取得API」はそのひとつ。 例のコードはPerlで書いてあるのだれども、ちょっとためしにGaucheを使って書いてみた。Gauche 0.8.8リリース記念ということで。 (use text.tree) (use sxml.tools) (use sxml.ssax) (use rfc.http) (define (make-request uri) (call-with-output-string (lambda(str-port) (write-tree `(,"<?xml version='1.0'?>" ,@ (sxml:sxml->xml `(methodCall (methodN
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く