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-17

DylanでL-99 (P11 ランレングス圧縮 その2)

| 16:18 | DylanでL-99 (P11 ランレングス圧縮 その2) - わだばLisperになる を含むブックマーク はてなブックマーク - DylanでL-99 (P11 ランレングス圧縮 その2) - わだばLisperになる

CLのsubseqに相当するものがないか探したのですが見付からず。それらしきものの実装では、copy-sequenceして切り出していたので真似してみました。これで良いのでしょうか…。

また、良く考えると、文字列の圧縮表現は変かなあと思いはじめました(;´Д`)普通にリストにした方が良いかも。

format-out("%=\n",
           #(a:, a:, a:, a:, b:, c:, c:, a:, a:, d:, e:, e:, e:, e:).encode-modified);
//=> #(#(4, #"a"), #"b", #(2, #"c"), #(2, #"a"), #"d", #(4, #"e"))

format-out("%=\n",
           #[a:, a:, a:, a:, b:, c:, c:, a:, a:, d:, e:, e:, e:, e:].encode-modified);
//=> #[#(4, #"a"), #"b", #(2, #"c"), #(2, #"a"), #"d", #(4, #"e")]

format-out("%=\n", "aaaabccaadeeee".encode-modified);
//=> "4a;b;2c;2a;d;4e"

// Code:
define generic single?
    (sequence :: <sequence>)
 => (result :: <boolean>);

define method single?
    (sequence :: <sequence>)
 => (result :: <boolean>)
  ~sequence.empty?
    & copy-sequence(sequence, start: 1).empty?
end method single?;

define generic encode-modified
    (sequence :: <sequence>)
 => (result :: <sequence>);

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

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

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

define method encode-modified
    (sequence :: <sequence>)
 => (result :: <sequence>)
  map(method(x) 
          if (x.single?)
            x.first
          else
            list(x.size, x.first) 
          end if
      end,
      sequence.pack1)
end method encode-modified;