كيف يمكنني من خلال تكرار دليل مشترك Lisp ؟
-
05-07-2019 - |
سؤال
أنا باستخدام OpenMCL على داروين و أود أن تفعل شيئا مثل:
(loop for f in (directory "somedir")
collect (some-per-file-processing f))
ولكن لا أستطيع الحصول على directory
العودة إلى أي شيء آخر من NIL
, وأنا لا يمكن أن يبدو للعثور على أي تفسير جيد على الانترنت (بخلاف "مختلفة لكل نظام").
أي نصائح ؟
المحلول
هل تحتوي مواصفات مسار الخاص بك البدل؟ الاشياء مسار اللثغة شيوعا هو من الصعب بعض الشيء لفهم في البداية - كان على الأقل بالنسبة لي ... كما في CLHS الدول على وظيفة directory
:
وإذا كان pathspec ليس البرية، و سوف القائمة الناتجة تحتوي على أي صفر أو واحد العناصر.
اقتباس فقرة>في أجل الحصول على مسار الخاص بك يتضمن البدل، قد حاولت وظيفة الماكياج مسار، مثل
(directory (make-pathname :directory '(:absolute "srv" "hunchentoot") :name :wild :type "lisp"))
وأو حتى
(directory (make-pathname :directory '(:absolute "srv" "hunchentoot") :name :wild :type :wild))
ولقد وجدت CL-FAD المكتبة مساعدة كبيرة للتعامل مع اسم الدليل ونظام الملفات . على وجه الخصوص، قد يكون لها list-directory
وظيفة أسهل استخداما من وظيفة directory
القياسية عادي.
نصائح أخرى
هناك أساسا طريقتان لتحديد pathnames:
- باستخدام السلاسل
سلاسل من الواضح اعتمادا على المنبر:Unix الجملة مقابلويندوز الجملة على سبيل المثال.
"/Users/foo/bar.text" is a valid pathname
"/Users/foo/*/foo.*" is a valid pathname with two wildcards
يمكنك إنشاء اسم كائن من سلسلة:
? (pathname "/Users/bar/foo.text")
#P"/Users/bar/foo.text"
إن #ف أعلاه يؤكد أن اسم الكائن (وليس سلسلة) يتم إنشاؤه عندما تقرأ مرة أخرى.
? #P"/Users/bar/foo.text"
#P"/Users/bar/foo.text"
لذا داخليا Common Lisp يعمل مع مسار الأشياء ، لكنه يتيح لك استخدام عادي سلاسل يجعل المسار الكائنات من لهم إذا لزم الأمر.
عندما Common Lisp يرى المسار الذي ليس جميع مكونات محددة (على سبيل المثال دليل مفقود) ، ثم يملأ في المكونات من اسم الكائن الذي هو قيمة variabel *DEFAULT-المسار-الافتراضات* .
مع وظيفة تصف يمكنك أن تبحث في مكونات المسار (هنا Clozure CL):
? (describe (pathname "/Users/bar/*.text"))
#P"/Users/bar/*.text"
Type: PATHNAME
Class: #<BUILT-IN-CLASS PATHNAME>
TYPE: (PATHNAME . #<CCL::CLASS-WRAPPER PATHNAME #x3000401D03BD>)
%PATHNAME-DIRECTORY: (:ABSOLUTE "Users" "bar")
%PATHNAME-NAME: :WILD
%PATHNAME-TYPE: "text"
%PHYSICAL-PATHNAME-VERSION: :NEWEST
%PHYSICAL-PATHNAME-DEVICE: NIL
- باستخدام اللثغة وظائف خلق مسار الأجسام
جعل المسار هو وظيفة يستغرق بضع كلمات الحجج لتحديد المكونات.
أحيانا يكون من المفيد أيضا إلى إنشاء المسار على أساس واحد القائمة:
(make-pathname :name "foo" :defaults (pathname "/Users/bar/baz.text"))
إذا كنت تستخدم الدليل المفيد استخدام المسار مع البدل. الدليل ثم سيعود قائمة مطابقة pathnames.اسم 'الدليل' هو قليلا مضللة لأن الدليل لا قائمة محتويات الدليل ، ولكن قوائم مطابقة pathnames ل (عادة) على المسار مع البدل.على البدل يمكن أن تطابق تسلسل من الأحرف في مكونات مثل /foo/s*c/القائمة*.l*".وهناك أيضا بطاقة البرية * * التي تستخدم في المباراة أجزاء من دليل hierachy مثل /foo/**/اختبار.اللثغة التي تطابق جميع الملفات الاختبار.اللثغة تحت الدليل فو و الدلائل.
(directory "/Users/foo/Lisp/**/*.lisp")
أعلاه يجب إرجاع قائمة من جميع 'اللثغة' ملفات '/المستخدمين/foo/Lisp/' و كل الدلائل.
للعودة .ج الملفات في دليل واحد استخدام:
(directory "/Users/foo/c/src/*.c")
علما بأن الدليل بإرجاع قائمة المسار الكائنات (لا قائمة السلاسل).
? (directory (make-pathname
:name "md5"
:type :wild
:directory '(:absolute "Lisp" "cl-http" "cl-http-342" "server")))
(#P"/Lisp/cl-http/cl-http-342/server/md5.lisp"
#P"/Lisp/cl-http/cl-http-342/server/md5.xfasl")
أعلاه يستخدم اسم الكائن الذي يتم إنشاؤه من قبل جعل المسار.فإنها ترجع جميع الملفات التي تطابق /Lisp/cl-http/cl-http-342/server/md5.* .
هذا هو نفسه:
(directory "/Lisp/cl-http/cl-http-342/server/md5.*")
وهو أقصر ، ولكن يعتمد على Unix مسار بناء الجملة.
الحديث Common Lisp مكتبة تنفيذ سرد الدليل هو IOLIB.
وهي تعمل مثل هذا:
CL-USER> (iolib.os:list-directory "/etc/apt")
(#/p/"trusted.gpg~" #/p/"secring.gpg" #/p/"trustdb.gpg" #/p/"sources.list"
#/p/"sources.list~" #/p/"apt-file.conf" #/p/"apt.conf.d" #/p/"trusted.gpg"
#/p/"sources.list.d")
نلاحظ أن أي مائل زائدة أو البدل المطلوبة.هو قوي جدا و يمكن حتى عملية أسماء الملفات بشكل غير صحيح مع ترميز أحرف unicode.
الاختلافات بالمقارنة مع CL-بدعة:
- الكائنات على IOLIB مسارات الملفات استبدال CL pathnames الذي هو أقرب ما الأساسية OS لا.
- IOLIB بتنفيذ إجراءات استخدام CFFI ، لذلك يعمل نفسه على كل اللثغة تطبيقات (المقدمة IOLIB لديه الخلفية لنظام التشغيل) ، على النقيض من CL-بدعة ، الذي يحاول مجردة على تنفيذ دليل وظيفة مع كل المراوغات.
- وعلى النقيض من CL-بدعة ، iolib يتعامل بشكل صحيح مع روابط الرمزية (مسألة رئيسية واحدة مع CL-بدعة أن يجعلها غير صالحة للاستعمال تقريبا على منصات أخرى من ويندوز IMHO).
سأضيف على سبيل المثال أن يعمل بالنسبة لي ، من أجل البرمجية المتكررة.يمكنني استخدام osicat (على غرار cl-بدعة) ، str.
تحرير:أيضا مع uiop:directory-files
.str:يحتوي على?يمكن القيام به مع search
.
;; searching for "ref".
(setf *data-directory* "~/books/lisp")
(remove-if-not (lambda (it)
(str:contains? "ref" (namestring it)))
(osicat:list-directory *data-directory*))
يعود
(#P"~/books/lisp/common-lisp-quick-reference-clqr-a4-booklet-all.pdf"
#P"~/books/lisp/common-lisp-quick-reference-clqr-a4-consec.pdf"
#P"~/books/lisp/commonLisp-interactive-approach-reference-buffalo.pdf")
فإنه يمكن بالتأكيد تحسين المناسب استخدام أحرف البدل.ومع ذلك هذا مقتطف يمكنك استخدام الآن :)
المراجع: