2017-03-18 2 views
1

Common Lispは与えられた結果を達成するための多くの柔軟なコーディングオプションを提供します。しかし、最良のアプローチを選択することは時々困難です。たとえば、次のベクトル式はすべて同じ結果を異なる方法で生成します。与えられたジョブに適切なコーディング表現を選択する

(defparameter objects (list 1 2 3)) 

(apply #'vector objects) 

(coerce objects 'vector) 

(make-array (length objects) :initial-contents objects) 

(read-from-string (format nil "#~S" objects)) 

もちろん、必要な出力に応じていくつかの式は他の式よりも柔軟性があります。上記のような出力では、どの基準を使用するかを決定するのに役立ちますか?

+0

一般的に、*あなたの特定の基準*物事のように:それは実際にやるべきことをしていますか?それは維持可能ですか?適切なパフォーマンスを持っていますか?それはうまくスケールされますか?店舗がすでに使用しているコーディングスタイルに合っていますか?スタイルはすでに適切であると仮定していますか? –

+0

他の言葉で言えば、あなたの** ** ** ** ** ** **の定義は、別の言い方をすると、* "これは私たちの具体的な機能要件と非機能要件を満たしていますか?固体)。 –

答えて

4
    (apply #'vector objects)
  • objects以上CALL-ARGUMENTS-LIMIT要素を保持していなければならないことであり、APPLYの通常の制限を受けます。あなたがほんの少しの引数しか持っていないときでさえ、これは悪いスタイルです。
  • COERCE:ジョブを実行するだけでなく、インテントも非常にうまく伝わります。ただし、結果のベクトルに追加のパラメータ(例:塗りつぶしポインタなど)を指定することはできません。ネストされたリストを行列に変換することはできません。
  • MAKE-ARRAYは、調整可能性、塗りつぶしポインタ、寸法、要素タイプ、変位のような結果の配列を完全に制御します。
  • READ-FROM-STRINGは、一般にデータ変換のために大きなではなく、です。無駄な計算の点では、このアプローチはRube Goldbergのバージョンcoerceです。また、文字列に含まれる内容について100%確信していない限り、多くのセキュリティ上の懸念があります。ここでは、文字列を自分で作成しますが、コードの別の部分がPRINT-OBJECTに再定義された値がデータに含まれていると、コードが壊れることがあります。
関連する問題