سؤال

أنا باستخدام 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")

فإنه يمكن بالتأكيد تحسين المناسب استخدام أحرف البدل.ومع ذلك هذا مقتطف يمكنك استخدام الآن :)

المراجع:

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top