2015-01-02 18 views
5

Orijinal argv işaretçisine bir Haskell main içinden erişmek mümkün mü?Haskell'den orijinal argv işaretçisine erişim

Kullanım durumu, uygulama başladıktan sonra komut satırı parametrelerini kaldırmak istediğim için ps aracılığıyla okunamıyor. Bunu yapmanın birkaç yolu vardır, ancak tümü orijinal argv'u manipüle etmeyi gerektirir.

Ben C sarmalayıcı yazarsanız bunu yapmak ve (sonradan here ala argv mucking) oradan hs_init çağırmak mümkün, ancak işe Haskell dan bunu yapmak daha güzel olurdu.

Teşekkürler!

PS - bu soru, prctl numaralı kopyasını kullandığı için duplicate'dan farklıdır, bu yalnızca söyleyebileceğim kadarıyla yalnızca işlem adını değiştirmenize izin verir. Ayrıca, yineleme programı çağırmak için kullanılan orijinal argv bir değiştirilebilen bir başvuru elde etmeye çalışırken, argv[0] "set" arıyor.

+3

İlk tahminim, setkgs işlevi olmadığından ve getArgs işlevi değişmez bir liste döndürdüğünden, bunun Haskell'den mümkün olmamasıdır. – bheklilr

+0

Teşekkürler. FFI kodunun üzerine dökülüyorum ve aynı sonuca vardım, ama göreceli olarak yeni olduğum için başka bir yolun olup olmadığını bilmiyordum. – aaronlevin

+1

Bu, 5 dakika önce mümkün olduğunu bilmediğim bir şeydi, bu yüzden bir yol olabilir, ancak eğer bir yol varsa, dahili bir kütüphanede garip bir köşe işlevi içerecektir. Kullanmakta olduğunuz derleyiciye bağlı olabileceğinden GHC'ye özel kitaplıklara bakın. – bheklilr

cevap

0

unix paketinden System.Posix.Env.ByteString(link) modülüne bakardım.

Çevreyi değiştirmek için işlevler içerir ve getArgs yalnızca setArgs işlevini eklemesi zor olmamalıdır.

+0

Bu strateji işe yaramıyor gibi görünüyor. System.Posix.Env.ByteString 'deki' getArgs' yöntemine çok benzer olan bu kodu [burada] (https://gist.github.com/bheklilr/ec78cc20e78479029812) deneyin. Belki bu biraz tembel değerlendirme ile ilgilidir? Emin değil. – aaronlevin

+0

hmmm ... 'getArgs >> = print' eklentisini eklemiş olsanız bile, orijinal arşivler yazdırılır. bu neden oluyor merak ediyorum. – ErikR