-2

次のコードを実行すると、エラーが発生しました: エラー: #cartesian (x) への引数の数が正しくありません>

;;;; 関数定義

(define (eps-func p)
   (let* ((p (lattice->cartesian))
         (x (vector3-x p))
         (y (vector3-y p))
         (z (vector3-z p)))
        (if (> sin(* 2 pi x y z) 0)
            (make dielectric
                    (epsilon 12))
            (make dielectric
                    (epsilon 1)))))

;;;; 関数呼び出し

(set! default-material (make material-function (material-func eps-func)))

どこが間違っているのかわかりません。上記のコードは、制御ファイルの一部にすぎません。

いくつかの背景情報は次のとおりです。

(lattice->cartesian x)

ここで、x は vector3 です

vector3 はどこかで定義されたデータ型です

3 ベクトル関数

(vector3 x y z)

指定されたコンポーネントで新しい 3-ベクトルを作成します。

(vector3-x v)
(vector3-y v)
(vector3-z v)

ベクトル v の対応するコンポーネントを返します。

material-func [関数] 1 つの引数、位置 vector3 の関数


この install.ps1 は、あなたが求めていることを実行すると思います。パッケージによって追加されたすべての DLL には、Copy Local の値として false が与えられます。ここでは、AssemblyReferences リストからすべての名前を取得する以外に何もしていないことに注意してください。ターゲット フレームワークなどに基づいた条件が必要な場合は、さらに何かを行う必要がある場合があります。

param($installPath, $toolsPath, $package, $project)

$asms = $package.AssemblyReferences | %{$_.Name}

foreach ($reference in $project.Object.References)
{
    if ($asms -contains $reference.Name + ".dll")
    {
        $reference.CopyLocal = $false;
    }
}
4

2 に答える 2

0

私にとっては、ここに2つのエラーがあるようです。最初に@flamingoはすでに言及しましたが、明確にするために、let-bound変数の名前を変更して、引数とは異なるようにします。さらに、sin の周りに欠けている括弧を追加しました。

(define (eps-func p)
   (let* ((tmp (lattice->cartesian p))
         (x (vector3-x tmp))
         (y (vector3-y tmp))
         (z (vector3-z tmp)))
        (if (> (sin (* 2 pi x y z)) 0)
            (make dielectric (epsilon 12))
            (make dielectric (epsilon 1)))))

ダミーの手順を使用してテストしましたが、うまくいくようです。それが役に立てば幸い。

于 2012-08-06T20:24:56.150 に答える
0

多分あなたは(lattice->cartesian))パラメータで呼び出すべきですか?または、この関数はラムダを返しますか?

于 2012-07-12T05:27:54.137 に答える