私はY連結子について説明したthisの記事を見つけました。コードはSchemeにありますが、私はCommon Lispを使って作業しようとしています。Common Lispで変数の関数を定義して使用する
しかし、SchemeからCommon Lispへの翻訳には問題があります。 Schemeは、関数と(その他の)変数の両方に単一の名前空間を使用しますが、Common Lispは関数と変数に異なる名前空間を使用します。この違いを解決してCommon Lispコードを動作させるには?
Schemeコード
ここでは、チュートリアルからいくつかのSchemeコードです。
(define (factorial n)
if (= n 0)
1
(* n (factorial (- n 1)))))
し、この中にそれを変換します:著者は階乗関数を定義初めに
:のでそれはスキームが何をするかだ(作者によれば)(define factorial (lambda (n) (if (= n 0) 1 (* n (factorial (- n 1))))))
スキームは、最初の定義を評価する前に、最初の定義を に変換するだけです。したがって、Schemeのすべての関数は実際にはラムダ の式です。
Common Lispの
Iは、第二の第一形態からこの移行を模倣するCommon Lispの上記断片の両方を書き換えることを試みました。しかし、CLにはdefine
はなく、どちらも単一の名前空間を持っていません。だから私はそれを回避しようとしました。 Common Lispでは最初のスキームの定義を書き換え
は簡単だった:2番目の定義にこれを翻訳
(defun factorial (n)
(if (= n 0)
1
(* n (factorial (- n 1)))))
しかし、(私には)少しトリッキーでした。私はこれを次のように翻訳しました:
(setf (symbol-function 'factorial)
(lambda (n)
(if (= n 0)
1
(* n (factorial (- n 1))))))
これは悪いやり方ですか?それは動作しているようだが、コンパイラは私にスタイル警告を与える:未定義関数:階乗。
私はコードを読むだけではなく、自分でコードを入力するほうが簡単です。おそらくこの場合、これはSchemeとCommon Lispの違いのために最善の考えではありません。 – Frank