2016-05-04 10 views
0

私はいくつかのSchemeコードをCommon Lispに変換しています。私はスキームを知らない。私はCommon Lispのことを少し知っています。関数にバインドされたScheme定数を同等のCommon Lispに変換する

まず、Schemeコードは、変数を定義する(またはそれが一定である?)、その値が関数の名前である:

(define (alert-propagators propagators) 
    ...) 

関数:ここ

(define alert-propagator alert-propagators) 

関数であります定数を参照することによって間接的に呼び出されます。

(alert-propagator arg) 

これはかなり滑らかです。

これはCommon Lispでも可能でしょうか?まず、私は定数を定義し、関数にバインドさ::ここに私が試したものだ

(defun alert-propagators (propagators) 
    ...) 

ファイン:

(defconstant alert-propagator #'alert-propagators) 

は、その後、私は機能を定義しました。

しかし、今、間接的に(一定の経由)関数を呼び出すために、私はfuncallのを使用する必要があります。

(funcall alert-propagator arg) 

私は敗北のようなもの定数(抽象化)を定義するの全体の目的だと思います。私が本当に欲しいのは、単純に書くことができることです:

(alert-propagator arg) 

Common Lispでこれを達成する方法はありますか?

答えて

2

Common LispはLISP2であり、これは、識別子の異なる名前空間がオペレータの位置にあり、識別子が他の位置にあることを意味します。

(defun square (x) 
    (* x x)) 

(defparameter square 10) ; unconventional, should be *square* 

(square square) ; ==> 100 

これは全く同じオブジェクトにsquare識別子点の(square square)両方を有するのでスキームで行うことができません。これは、関数を引数としてとる関数(Schemeの中では手続き)です。

(function square)または構文短形式#'squareを使用して関数名空間からオブジェクトを取得することができるため、関数名前空間で実際の関数バウンドを値として取得できます。

また、#'squareと同じ関数に評価されるように、の関数名前空間値を得ることができます。(symbol-function 'square)は評価します。これは、関数名空間内の何かを値に設定するために開くことができるsetfの場所として機能することができるという特徴があります。

(setf (symbol-function 'test) #'square) 
(test square) ; ==> 100 

defconstantdefparameterdefvarは、関数の名前空間には何も設定しません。第2引数は実際には関数である場合にのみ動作します。 Thayは通常の変数としてのみ使用でき、funcallapplyに適用できる関数にも使用できます。

あなたは、システムがインライン化許可されているので、定数を変更すると、あなたが再読み込みされない限り、コードに影響を与えて再コンパイルしない場合がありますように時間の終わりにも当てはまるの値よりも他のすべてのためにdefconstantの使用を控える必要があります。すべての実際的な目的でdefparameterと適切な+NAMING-CONVENTION+を使用すると、+VAT+のような準定数が来年に変更される可能性があります。

Schemeには定数はありませんが、R5RSのゼロ環境は、元のバージョンを使用した定数の折りたたみが何も壊れないように、元のプロシージャのデータと同じように動作することが期待されます。 R6RS(とおそらくR7RS)では、インポートされたフォームを、他のインポートステートメントからもオーバーライドすることはできません。 Schemeではを再定義するのではなく、setfsetqを使用して、defparamaterまたはdefvarで作成した変数をCommon Lispに設定するのと同じように、set!を再定義しません。

+0

本当に異常な - ありがとう@Sylwester! –

+0

@RogerCostelloよろしくお願いします。:-) – Sylwester

関連する問題