Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-06-12

DylanでL-99 (P10 ランレングス圧縮)

| 17:07 | DylanでL-99 (P10 ランレングス圧縮) - わだばLisperになる を含むブックマーク はてなブックマーク - DylanでL-99 (P10 ランレングス圧縮) - わだばLisperになる

前回定義した、packの補助関数のpack1とjoinを使っています。

Dylanのライブラリの取り込み方と定義方法が良く分からない…。

#(a:, a:, a:, a:, b:, c:, c:, a:, a:, d:, e:, e:, e:, e:).encode
//=> #(#(4, a:), #(1, b:), #(2, c:), #(2, a:), #(1, d:), #(4, e:))

#[a:, a:, a:, a:, b:, c:, c:, a:, a:, d:, e:, e:, e:, e:].encode
//=> #[#(4, a:), #(1, b:), #(2, c:), #(2, a:), #(1, d:), #(4, e:)]

"aaaabccaadeeee".encode
//=> "4a;1b;2c;2a;1d;4e"

// Code:
define generic encode
    (sequence :: <sequence>)
 => (result :: <sequence>);

define method encode
    (sequence :: <list>)
 => (result :: <list>)
  as(<list>,next-method())
end method encode;

define method encode
    (sequence :: <vector>)
 => (result :: <vector>)
  as(<vector>,next-method())
end method encode;

define method encode
    (sequence :: <string>)
 => (result :: <string>)
  join(map(method(x)
               format-to-string("%d%s", x.size, x.first) 
           end,
           sequence.pack1),
       ";")
end method encode;

define method encode
    (sequence :: <sequence>)
 => (result :: <sequence>)
  map(method(x)
          list(x.size, x.first)
      end,
      sequence.pack1)
end method encode;