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-05-06

DylanでL-99 (P05 シーケンスを反転させる )

| 20:23 | DylanでL-99 (P05 シーケンスを反転させる ) - わだばLisperになる を含むブックマーク はてなブックマーク - DylanでL-99 (P05 シーケンスを反転させる ) - わだばLisperになる

うーん、入力のクラスと同じクラスで出力させたいのだけれど、object-classでは上手く行かないので、selectで振り分け。

絶対変な書き方だと思うんだけれども…。

forは、CLのdoを強化したようなもので、loopの機能も取り入れていますが、基本的に構文はdoに良く似ています。

#(foo:, bar:, baz:).rev
//=> #(baz:, bar:, foo:)

#[foo:, bar:, baz:].rev
//=> #[baz:, bar:, foo:]

"foobarbaz".rev
//=> "zabraboof"

define generic rev 
    (sequence :: <sequence>)
 => (result :: <sequence>);

define method rev
    (sequence :: <sequence>)
 => (result :: <sequence>)
  let result = make(<deque>);
  for (elt in sequence)
    push(result, elt);
  finally 
    as(select (sequence by instance?)
         <list> => <list>;
         <string> => <string>;
         <vector> => <vector>;
       end select, result)
  end for
end method rev;