हम्म! कुछ पुरातत्व!
2004 के बाद से मैंने go
पूंछ-पुनरावर्ती कार्यकर्ता लूप के लिए सामान्य नाम के रूप में उपयोग किया है , जब एक पुनरावर्ती फ़ंक्शन के कार्यकर्ता / आवरण परिवर्तन करते हैं। मैंने इसे व्यापक रूप से उपयोग करना शुरू कर दिया bytestring
, जैसे
foldr :: (Word8 -> a -> a) -> a -> ByteString -> a
foldr k v (PS x s l) = inlinePerformIO $ withForeignPtr x $ \ptr ->
go v (ptr `plusPtr` (s+l-1)) (ptr `plusPtr` (s-1))
where
STRICT3(go)
go z p q | p == q = return z
| otherwise = do c <- peek p
go (c `k` z) (p `plusPtr` (-1)) q
{-# INLINE foldr #-}
bytestring
अगस्त 2005 से था ।
यह आरडब्ल्यूएच में लिखा गया था , और शायद वहां से लोकप्रिय हुआ था। इसके अलावा, स्ट्रीम फ्यूजन लाइब्रेरी में, डंकन कॉउट्स और मैंने इसे बहुत कुछ करना शुरू कर दिया।
जीएचसी स्रोतों से
मुहावरे हालांकि आगे वापस लौट जाते हैं। foldr
GHC.Base में दिया गया है:
foldr k z = go
where
go [] = z
go (y:ys) = y `k` go ys
जो शायद मैं कहाँ चाल उठाया है (मुझे लगता है कि यह एंडी गिल की थीसिस से था, लेकिन go
वहां कोई उपयोग नहीं मिल सकता है )। इसे गोफर में इस रूप में नहीं दिया गया है, इसलिए मुझे लगता है कि यह पहली बार GHC कोड बेस में दिखाई दिया।
2001 तक, साइमन मार्लो go
कुछ सिस्टम-स्तरीय कोड का उपयोग कर रहा था , इसलिए हम दोष को जीएचसी में कहीं रख सकते हैं, और यह सुराग हमें जीएचसी स्रोत तक ले जाता है , जहां go
कार्यकर्ता कार्यों में व्यापक रूप से उपयोग किया जाता है:
myCollectBinders expr
= go [] expr
where
go bs (Lam b e) = go (b:bs) e
go bs e@(Note (SCC _) _) = (reverse bs, e)
go bs (Cast e _) = go bs e
go bs (Note _ e) = go bs e
go bs e = (reverse bs, e)
जीएचसी 3.02 और ग्लासगो
जीएचसी के पुराने संस्करणों को खोदते हुए, हम देखते हैं कि जीएचसी 0.29 में यह मुहावरा नहीं दिखता है, लेकिन जीएचसी 3.02 श्रृंखला (1998) द्वारा, go
मुहावरा हर जगह दिखाई देता है। 1996-1997 Numeric.lhs
की परिभाषा में , एक उदाहरण,showInt
showInt n r
| n < 0 = error "Numeric.showInt: can't show negative numbers"
| otherwise = go n r
where
go n r =
case quotRem n 10 of { (n', d) ->
case chr (ord_0 + fromIntegral d) of { C# c# ->
let
r' = C# c# : r
in
if n' == 0 then r' else go n' r'
}}
यह H98 रिपोर्ट में दिए गए एक अलग कार्यान्वयन है । के कार्यान्वयन में खुदाई "Numeric.lhs" , तथापि, हम पाते हैं कि यह संस्करण है कि 1997 में GHC 2.06 में जोड़ा गया था के रूप में ही नहीं है, और Sigbjorne Finne से एक बहुत ही दिलचस्प पैच प्रकट होता है, अप्रैल 1998 में, एक जोड़ने go
न्यूमेरिक को लूप।
यह कहा गया है कि 1998 तक कम से कम, Sigbjorne जोड़ने था go
GHC के छोरों "एसटीडी" पुस्तकालय, जबकि एक साथ, कई GHC संकलक कोर में मॉड्यूल था go
छोरों। आगे की खुदाई करते हुए, जुलाई 1996 में विल पार्टेन की यह बहुत ही दिलचस्प प्रतिबद्धता जीएचसी में एक "गो" लूप जोड़ती है - हालांकि कोड साइमन जेजे से आता है!
इसलिए मैं इसे ग्लासगो में लोगों द्वारा आविष्कृत ग्लासगो मुहावरे के रूप में बुलाने जा रहा हूं , जो 90 के दशक के मध्य में सिमोन मार्लो , सिगबॉर्न फिन , विल पार्टन और साइमन पेटन जोन्स जैसे जीएचसी पर काम करते थे ।
loop
इसके बजाय अपने फ़ंक्शन को कॉल करता हूं ।