2017-11-10 15 views
0

スキームを使用してポイント距離公式をプログラムしようとしています。私はエラーが出ることを除いて、私はそれを得ることに非常に近いです。ポイント距離公式のプログラミング時にスキームエラーが発生する - 手順を適用しないようにしよう

正確なエラーがある:ここ

Traceback (most recent call last): 

File "In [54]", line 5, col 11, in 'application' 

File "In [54]", line 5, col 11 

RunTimeError: attempt to apply non-procedure '4' 

が私のコードである:参考

; code for the distance procedure 

(define (distance p1 p2) (sqrt (+ (* (- (car(p2)) (car(p1))) (- (car(p2)) (car(p1)))) (* (- (car(cdr(p2))) (car(cdr(p1)))) (- (car(cdr(p2))) (car(cdr(p1)))))))) 

(distance (4 5) (3 2)) 

、点距離式は:((×√

- X1)^ 2 +(y2 - y1)^ 2)

+0

フォロースキームの構文。 schemeの関数の一般的な構造は '(function arg1 arg2 ...)'なので、 '(car(p1))'の代わりに '(car p1)'のようなものを使うことができます。 – assefamaru

+0

'(4 5) 'は引数 '5'を手続き '4'に渡そうとします。 Scheme構文の基本を確認します。 – molbdnilo

答えて

0

一般的にeverythinを入れずにスキームコードを正しくフォーマットする方が良いgを1行で表示します。

中間値に名前を付けると便利です。数式にx1,x2,y1およびy2が含まれている場合は、これらの名前のScheme変数を作成します。これにより、ソリューションの理解が容易になります。

スキームには、ネストされたcarcdr関数の略語がいくつかあります。 cdrcarが必要な場合は、cadrを使用できます。

Schemeでは、変数名に数学記号を使用することができます。変数にx2x1の差が含まれている場合は、x2-x1という名前を付けることができます。これにより、Schemeのポーランド語表記法の可読性が向上します。

(define (distance p1 p2) 
    (let ((x1 (car p1)) 
     (y1 (cadr p1)) 
     (x2 (car p2)) 
     (y2 (cadr p2))) 
    (let ((x2-x1 (- x2 x1)) 
      (y2-y1 (- y2 y1))) 
     (sqrt (+ (* x2-x1 x2-x1) 
       (* y2-y1 y2-y1)))))) 

リストリテラルを関数に渡す場合は、評価を防止するためにリテラルを引用する必要があります。正しく

(distance '(4 5) '(3 2)) 

または使用評価:一貫

(distance (list 4 5) (list 3 2)) 
関連する問題