2011-11-15 6 views
4

私は、純粋な関数型プログラミングの概念に慣れ親しんでいます。どの言語でも便利なことをする前に、いくつかの基本的なデータ構造と、それを効果的に操作する方法、特に列挙可能なデータ構造を理解する必要があります。guileスキームでは、どのようにキーと値のペア(ハッシュマップ)のリストを反復処理できますか?

(map (lambda (v) 
     (display (string-append v "\n")) 
    '(1 2 3)) 
=> 
1 
2 
3 

何ハッシュテーブル/ハッシュマップはスキームでのように見えるん:

私はこのようなリストを(私が正しくかどうか、これをインデントしていた場合、私はよく分からない)反復処理することができますか?それを表現するための実際のデータ構造はありますか、それともリストのリストを作ることになりますか?その場合、内側のリストとは別の変数としてキーと値をどうやって取得しますか?

ラムダは一つの値ではなく、2見込んので、明らかにこれは、間違っている:私は何をしようとしているのRubyの同等のようになり

(map (lambda (key value) 
     (display (string-append key " => " value)) 
    '('("one" 1) '("two" 2) '("three" 3))) 

を:

{ "one" => 1, "two" => 2, "three" => 3 }.map do |key, value| 
    puts "#{key} => #{value}" 
end 
+0

P.S.関数の戻り値が使用されていないときは、 'map'の代わりに' for-each'を使うべきです。 –

+0

ありがとう、私はループ上のwikiのページからマップを得て、戻り値が無視できるので使用されたと仮定しました:)よく知っておいてください! – d11wtq

答えて

3

あなたがいる場合R6RS hashtablesを使用すると、hashtable-keyshashtable-entries機能を使用できます。

あなたがGuile's native hashtablesを使用している場合は、hash-map->listhash-for-eachhash-for-each-handle、またはhash-foldを使用することができます。あなたがしたい、ガイルのhash-for-eachを使用して、例えばので

、:

(define my-hash (make-hash-table)) 
(hash-set! my-hash "one" 1) 
(hash-set! my-hash "two" 2) 
(hash-set! my-hash "three" 3) 
(hash-for-each (lambda (key value) 
       (format #t "~a => ~a~%" key value)) 
       my-hash) 
+0

すごく、ありがとう、私は、ライブラリを見る前にネイティブで利用可能なものを見つけ出すことに固執すると思います(少なくとも基本的なデータ構造の場合のみ)。私は以前はネイティブのハッシュテーブルのサポートを見たことはありません:) – d11wtq

関連する問題