2017-02-01 5 views
0

私はクロージャーの初心者ですので、私にご負担ください。clojure - マクロ内マップの破壊に問題があります

ようにマクロを書き込む:letブロックの

`(let [query# (:query-params ~'+compojure-api-request+) 
     options# (select-keys query# [:sort-by :from :to])]) 

最初の行は、http requestからquery-params destructures - この構造生成:

{sort-by billing-account/name, from 0, to 10, payment-due , payment-method , search }

をトラブルが第二であるが私がselect-keysを使用すると空のマップを返しますが、たとえば(first query#)と言うと、出力は次のようになります。[sort-by billing-account/name]

select-keysが機能しない理由を教えてください。

P.S.試しました(get query# :from) & (:from query#) - そこにも運はありません。

UPD

キーは文字列ではなく、キーワードだった - したがって、キーとして文字列を使用すると、うまく動作します。ところで

+0

マップのキーはキーワードであり、記号や文字列ではありませんか? – Lee

+0

@Leeは私の質問を編集しました。はい、それは記号でした。 – Sasha

答えて

1

、あなたも:strsとdestructure文字列キーができます。

(let [m {"sort-by" "billing-account/name", 
     "from" "0", 
     "to" "10", 
     "payment-due" nil, 
     "payment-method", "search"} 
     {:strs [sort-by from to payment-due payment-method]} m] 
    (println sort-by from to payment-due payment-method)) 

;;=> billing-account/name 0 10 nil search  

非構造構文の完全な説明についてはhttps://clojure.org/guides/destructuringを参照してください。

0

あなたは、キーワード、シンボル、文字列の違いによって混乱すると思います。あなたのコメントでは、それらは記号であると言いますが、編集では文字列であると言います。

あなたは違いをよく読んでください。インターネットから来ているものが

慣用のものは通常のマップキーなどのキーワードを使用して好むことです、( json、httpヘッダーなど)は時にはすべての文字列です。

あなたの質問に直接答えるには、select-keysに渡されるキーは、マップ内のキーと等しい(=関数を使用する)必要があります。この場合、同じタイプである必要があります。

;; For example 

(select-keys {'foo 1 'bar 2} ['foo]) ;=> {foo 1} 

(select-keys {:foo 1 :bar 2} [:foo]) ;=> {:foo 1} 

(select-keys {"foo" 1 "bar" 2} ["foo"]) ;=> {"foo" 1} 

また、私はこれがマクロである必要があると質問します。プレーンな機能が動作しない理由はありますか?

+0

こんにちは、お返事いただきありがとうございます、混乱していない、ミスタイプ、私はコメントを編集しようとしましたが、それは私を許しませんでした:-( – Sasha

関連する問題