#:g1: dylanでL-99 (P05 シーケンスを反転させる )

Posted 2008-05-06 11:23:00 GMT

-(http://www.ic.unicamp.br/~meidanis/courses/mc336/2006s2/funcional/L-99_Ninety-Nine_Lisp_Problems.html)
うーん、入力のクラスと同じクラスで出力させたいのだけれど、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;


comments powered by Disqus