2009-08-17 5 views
1

私はRubyを使って "The Little Schemer"で演習をしようとしています。原子の同等のメソッドを知りたいですか? Rubyのためのスキーム。原子のルビーメソッド?スキーム

原子?渡された引数がアトムの場合はtrueを返し、それ以外の場合はfalseを返すメソッドです。 私が理解しているところでは、原子は文字列か数字である可能性があります。それはリストではありません。

答えて

1

通常、配列のようなオブジェクトは 'to_a'(to配列)メソッドに応答します。 可能な原子の実装は次のようになります。

class Object 
    def atom? 
     not respond_to? :to_a 
    end 
    end 

    42.atom? #=> true 
    {foo: 'bar'}.atom? #=> false 
+0

ルビ1.8では、すべてのオブジェクトがto_aに応答するため、これは機能しません。これはruby 1.9でのみ動作します。 – newacct

+0

残念です、いいえ: irb(main):002:0> {'foo' => 'bar'} to_a => [["" foo "、" bar "] ] – user60401

2

私はRubyはリテラルでいる原子に最も近い同等の推測 - Fixnumか、ブール値、シンボル、およびnilを。これは事実上実装の詳細になりますが、これらのオブジェクトはCポインタとしてではなくスタック上の値によって直接表されます。だから#atom?スキーム中の原子は、リスト(「短所」演算子を使用して作成のもの)とヌルを除くすべてですので

(define atom? 
    (lambda (x) 
    (and (not (pair? x)) (not (null? x))))) 

:リトルスキーマーで定義されたスキームで

class Object 
    def atom? 
    case self 
    when Fixnum, TrueClass, FalseClass, NilClass, Symbol 
     true 
    else 
     false 
    end 
    end 
end 
+0

SchemeのNilに相当するのは空のリストです。これはアトムではありません。メソッドもアトムです。 (私は不愉快にならないという意味ではありません - 実際にこの質問は*良い答えがあるとは思わない) –

+0

"それはどのようなユースケースですか?私たちは本当にそれに答えるのに十分な情報がありません。 – user60401

4

原子、:次のようになります。 。 Schemeでは、それはシンボル、数値、メソッド、そしておそらく私が忘れているいくつかの事柄に終わります。 Rubyははるかに複雑です。

リトル・スケジューラの演習では、RubyのアトムはFixNum、シンボル、TrueValue、またはFalseValueです。または方法。リストの場合、Rubyの配列型のcons、car、およびcdrメソッドを定義する必要があります。私は実際には配列ではなく、無しではないものは原子だと言うかもしれません。この議論はある時点で主観的になる。

そして、おそらく、すべてを同じように動作させるためには、より多くのハッキングを行う必要があります。かなり正直なところ、私はLittle Schemerを愛していますが、それはかなりLisp特有のものを持っていますが、私はHaskellのような別の関数言語にそれを適用することができます。too much多くのトラブル、 Rubyのような言語で動作させる価値があるよりも面倒です。