كيف أقوم بإنشاء مقبض في الذاكرة في هاسكل؟

StackOverflow https://stackoverflow.com/questions/60569

  •  09-06-2019
  •  | 
  •  

سؤال

أريد شيئًا يشبه مقبض الملف ولكنه مدعوم بالفعل بمخزن مؤقت في الذاكرة لاستخدامه في عمليات إعادة توجيه الإدخال/الإخراج.كيف يمكنني أن أفعل هذا؟

هل كانت مفيدة؟

المحلول

لا يمكن ذلك دون تعديل المترجم.وذلك لأن المقبض هو نوع بيانات مجرد، وليس فئة كتابة.

نصائح أخرى

لقد كتبت للتو مكتبة توفر هذا، تسمى "المقبض" [hack].يمكنك استخدامه لإنشاء Handleالذي يشير/يعدل أ ByteString:

import Data.ByteString (pack)
import Data.Knob
import System.IO

main = do
    knob <- newKnob (pack [])
    h <- newFileHandle knob "test.txt" WriteMode
    hPutStrLn h "Hello world!"
    hClose h
    bytes <- Data.Knob.getContents knob
    putStrLn ("Wrote bytes: " ++ show bytes)

إذا كان بإمكانك التعبير عما تريد القيام به فيما يتعلق بلغة C أو مكالمات النظام، فيمكنك استخدام واجهة الوظائف الخارجية (FFI) الخاصة بـ Haskell.لقد بدأت في اقتراح استخدام mmap، ولكن بعد التفكير مرة أخرى، أعتقد أن mmap قد يكون تعيينًا بطريقة خاطئة حتى لو استخدمته مع الخيار المجهول.

يمكنك العثور على مزيد من المعلومات حول Haskell FFI على موقع haskell.org wiki.

قد لا يكون هذا ممكنا. GHC, ، على الأقل، يبدو أنه يتطلب مؤشرًا للحصول على واصف ملف نظام التشغيل الذي يتم استخدامه لجميع عمليات القراءة/الكتابة/البحث.

يرى /libraries/base/IOBase.lhs من مصادر GHC

قد تتمكن من الحصول على نفس التأثير من خلال الاستعانة بمساعدة نظام التشغيل:قم بإنشاء ملف مؤقت، وقم بتوصيل المقبض به ثم قم بتعيين الملف في الذاكرة لعمليات إعادة توجيه الإدخال/الإخراج.بهذه الطريقة، سيصبح كل المقبض I/O مرئيًا في قسم الذاكرة المعينة.

وهذا في الواقع خطأ في تصميم المكتبة، وهو ما أزعجني أيضًا.أرى طريقتين لفعل ما تريد، ولا يعتبر أي منهما جذابًا للغاية.

  1. أنشئ فئة كتابة جديدة، واجعل المقبض الحالي مثيلًا لها، واكتب مثيلًا آخر للقيام بأمر البيانات الموجودة في الذاكرة، وقم بتغيير جميع برامجك التي تحتاج إلى استخدام هذه التسهيلات.ربما يكون هذا بسيطًا مثل الاستيراد System.SIO (أو ما تريد تسميته) بدلاً من System.IO.ولكن إذا كنت تستخدم إجراءات الإدخال/الإخراج المخصصة في المكتبات مثل Data.ByteString, ، هناك المزيد من العمل الذي يتعين القيام به هناك.

  2. أعد كتابة مكتبات الإدخال/الإخراج لتوسيعها لدعم ذلك.ليس بالأمر التافه، ويتطلب الكثير من العمل، لكنه لن يكون عملاً صعبًا بشكل خاص.ومع ذلك، إذن لديك مشكلة في التوافق مع الأنظمة التي لا تحتوي على هذه المكتبة.

لإضافة إجابة حديثة لهذا السؤال، يمكنك استخدام createPipe من System.Process:

createPipe :: IO (Handle, Handle)

https://www.stackage.org/haddock/lts-10.3/process-1.6.1.0/System-Process.html#v:createPipe

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