2017-03-20 21 views
-1

私は経路計画ロボットで作業しています。ロボットは、ubergraphを使用してオフィス内の部屋を横断し、小包を収集して配達することができます。しかし、私がルートを計画したいときに、荷物が配達されたという事実を出力したいときは、 "Delivered"メッセージがルートプランの前に出力されています。Clojure - 出力が間違った順序で表示される

私はなぜこれが起こっているのか知っています、それは私のif文などの順序のためです。しかし、私は印刷物のために考えることができるすべての場所を試してみました。

誰にでも次のコード行をどこに移動する必要があるのでしょうか。

以下に含まれる機能の完全なコードです。

(defn multipleparcels [parcel] 
    (def newparcel (first parcel)) 
    (def start (:start newparcel)) 
    (def end (:end newparcel)) 
    (def delivery (:delivery newparcel)) 
    (if (empty? parcel) 
    (println "Deliveries Completed") 
    (if (= delivery "Delivery") 
     (println "Parcel Delivered") 
     (println "Parcel Collected"))) 
    (journey start end) 
    (multipleparcels (rest parcel))) 

どのようなヒントをいただければ幸いです。

編集:私は今

(defn multipleparcels [parcel] 
    (let [newparcel (first parcel) 
    start (:start newparcel) 
    end (:end newparcel) 
    delivery (:delivery newparcel)] 
    (if (empty? parcel) 
    (println "Deliveries Completed") 
    (doall (journey start end) 
    (if delivery 
     (println "Parcel Delivered") 
     (println "Parcel Collected")) 
    (multipleparcels (rest parcel)))))) 
+0

残念ながら、Clojureのコードにジャンプする前に、このコードで重大な間違いを犯しました(すべてを書いておきます)。Clojureのチュートリアルを確認してください。 –

答えて

1

journeyを実装するために管理していることは明らかにいくつかの副作用関数であるが、それは本当にあなたが値を無視するので、ここで何を行う、とstart以来、endていません、およびdeliveryは関数のパラメータから派生しています。

考慮すべきいくつかのこと:

  1. あなたはdefは、この関数の内部でINGのすべきではありません。
  2. あなたは(= delivery "Delivery")かどうかをチェックしている...これは、バイナリ状態なので、それはdeliveryは、単純なブールなるようにするおそらく最高ですので、それは(if delivery then else)
  3. だ繰り返しますが、私はjourneyについてはよく分からないが、それは何もしていませんここに。
  4. 最後の行であるmultipleparcelsが毎回実行されるので、関数は永遠にループします。
  5. な破壊が必要ではないが、multipleparcelsが本当に機能がをやっていることについては何も言っていないよう少し物事をクリーンアップすることができ
  6. あなたの機能は、よく名前が付いていません。また、パラメータparcelは、コンテキストが複数の受信を示唆している場合に、1つのパーセルを受信することを意味します。ここで

それはあなたが望むものではありませんし、多分あなたはあなたのデータを処理する方法についていくつかのアイデアを得ることができたとしても、何かをするコードです:

(def data 
    [{:start "a" :end "c" :delivery true} 
    {:start "d" :end "f" :delivery false} 
    {:start "x" :end "y" :delivery true}]) 

(defn process-parcels 
    [[{:keys [start end delivery] :as parcel} & parcels]] 
    (if parcel 
    (do 
     (if delivery 
     (println "Parcel Delivered") 
     (println "Parcel Collected")) 
     (process-parcels parcels)) 
    (println "Deliveries Completed"))) 

(process-parcels data) 

Parcel Delivered 
Parcel Collected 
Parcel Delivered 
Deliveries Completed 
=> nil 

私は戻って一歩を踏み出し示唆し、いくつかの基本的なクロージャー演習を行うので、あなたがやっていることであり、命令的なプログラミングスタイルで共通している変数に値を割り当てることと、式を評価することの違いを理解することができます。一度あなたはこれのハングを取得すると、はるかに簡単になり、楽しいです!がんばろう!

+0

こんにちは、私は旅行に関連するコードを追加し、どのように私の質問に機能を使用しているか示しました。あなたのスタイルのコードを実装しようとします。私の他のコードに関連するアドバイスは大いにありがたいです – benjano

+0

こんにちはJosh、私はいくつかの提案を実装しました。私が書いたコードはより機能的か、それともまだ問題はありますか? – benjano

+0

@benjanoあなたは間違った括弧をいくつか持っています - 'doall'への呼び出しは正しくありません(あなたがそこでやっていると仮定している怠惰なseqを強制的に実行しようとしていても、あなたのプログラムに必要な副作用があっても、あなたの関数は単一の入力、 'parcel'だけに依存するので、あなたの' journey'呼び出しはこの関数に関係する何もできません。また、インデントとスタイルが不明瞭になります。しかし、あなたの最初の試みよりも優れています。 – Josh

関連する問題