まず、現在では、Lispという単一の言語はなく、Lispは言語ファミリーの総称になっています。
http://ja.wikipedia.org/wiki/LISP
ですので、おおまかな傾向の回答となります。
- Lispの組み込み関数は、どこのディレクトリに配置されているのか?
大抵の場合、ディレクトリ構造と関係はありませんが、多くのLisp系言語では、
ソースコードの位置を保持する機能がかなり昔から存在します。
Lispの方言の一つであるCommon LispのSBCLという処理系での場合では、+
関数の定義のの場所は、
(sb-introspect:find-definition-source #'+)
;=> #S(sb-introspect:definition-source
; :pathname #P"SYS:SRC;CODE;LIST.LISP"
; :form-path (54)
; :character-offset 10030
; :file-write-date 3639135408
; :plist nil
; :description nil)
(translate-logical-pathname #P"SYS:SRC;CODE;NUMBERS.LISP")
;=> #P".../src/code/numbers.lisp"
という風に組み込み関数によって調べられます。
この機能をIDEから呼ぶことでソースコードにジャンプします。
- 高級言語で記述されているのではなく、バイナリで組み込まれているのか?
これはホスト言語(LISP)自身で記述されているかどうか、ということでしょうか。
LISP系言語の場合、極基本的な関数以外は、自分自身で記述されています。
上記SBCLでの+
の場合、
(macrolet ((define-arith (op init doc)
#!-sb-doc (declare (ignore doc))
`(defun ,op (&rest numbers)
#!+sb-doc
,doc
(if numbers
(let ((result (the number (fast-&rest-nth 0 numbers))))
(do-rest-arg ((n) numbers 1 result)
(setq result (,op result n))))
,init))))
(define-arith + 0
"Return the sum of its arguments. With no args, returns 0.")
(define-arith * 1
"Return the product of its arguments. With no args, returns 1."))
と記述されています。
+
の定義に+
が使われていますが、これは更にプリミティブなものが先に定義されていて、それを上書きしています。
何れにせよ、どこかで機械の命令と結び付ける必要があるため、どんどん遡って行くと、最終的には、直接
または間接的にアセンブリや、他の実装言語の記述がでてくることと思います。
ソースコードを処理系内で確認できるかどうかは処理系によりますが、Common Lispでは大抵サポートされていて、Schemeでは若干のサポートがあります。
処理系が教えてくれない場合は、grep等で見付けることになります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2015/05/28 14:05