#:g1: CLRFI-1: featurepの紹介

Posted 2014-04-28 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の119日目です。

CLRFI-1: featurepとはなにか

 CLRFI-1: featurepは、処理系やホスト機の機能を判定する関数です。CLRFI-1として制定されていました。

パッケージ情報

パッケージ名CLRFI-1: featurep
プロジェクトサイト(消滅) CLRFI: 1: FEATUREP

インストール方法

 プロジェクトページにソースがあるので適当にコピペしましょう。
alexandriaやasdfにも同様のものが含まれているので、そっちを使っても良いでしょう。

;;; CLRFI 1: FEATUREP

(in-package "COM.ALPHAGEEKSINC.CLURFI.SYSTEM-CONSTRUCTION.FEATUREP")

;;; The package is nicknamed "COMMON-LISP.EXTENSIONS.SYSTEM-CONSTRUCTION.FEATUREP" ;;; "CL.EXT.SYSTEM-CONSTRUCTION.FEATUREP", "FEATUREP", plus the CLRFI ;;; marker "CLRFI-<nn>". ;;; Notes. The implementation reflects the requirements posed by the ;;; ANSI specification on the #- and #+ read macros. The two read ;;; macros bind *PACKAGE* to the KEYWORD package. Hence the test is ;;; done on :AND, :OR, and :NOT.

(use-package "COMMON-LISP")

(defun featurep (feature-expression) (etypecase feature-expression (symbol (not (null (member feature-expression *features*)))) (cons ;; Not LIST, as we've already eliminated NIL. (ecase (first feature-expression) (:and (every #'featurep (rest feature-expression))) (:or (some #'featurep (rest feature-expression))) (:not (not (featurep (cadr feature-expression))))))))

試してみる

 基本的に、#+や、#-と同じ機能の関数で、emacs lispのfeaturepや、MacLISPの(status feature ...)に似たものです。

(clrfi-1:featurep '(:and :sbcl (:or :x86-64 :x86)))
;=>  T

のように書けます。これくらいの複雑度だとfeaturepを使わないと、

(and (find :sbcl *features*)
     (or (find :x86-64 *features*)
         (find :x86 *features*))
     t)
;=>  T

のようにごちゃっとします。

関連

まとめ

 今回は、CLRFI-1: featurepを紹介してみました。
CLRFIは、2004年頃に立ち上がった、SchemeのSRFIをCommon Lispでやろうというプロジェクトだったようですが、現在消滅したようです。
現在、似たようなところとしては、CDRプロジェクトがあります。

comments powered by Disqus