হুঁ! কিছু প্রত্নতত্ত্ব!
২০০৪ সাল থেকে আমি 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
সেখানকার কোনও ব্যবহার খুঁজে পাচ্ছি না )। এটা তোলে নয় , Gofer এই ফর্মটি দেওয়া তাই আমি মনে করি এই প্রথম 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 এর মধ্যে সিগবজর্ন go
জিএইচসি "স্টাডি" লাইব্রেরিতে লুপ যুক্ত করছিল , একই সময়ে, জিএইচসি সংকলক কোরের অনেকগুলি মডিউলgo
লুপ ছিল । আরও খনন, জুলাই 1996 সালে উইল পার্টেনের থেকে এই খুব আকর্ষণীয় প্রতিশ্রুতি জিএইচসি-তে একটি "গো" লুপ যুক্ত করেছে - কোডটি সাইমন পিজে থেকে এসেছে যদিও!
তাই আমি এটাকে গ্লাসগোতে উদ্ভাবিত গ্লাসগো আইডিয়ম হিসাবে ডাকতে যাচ্ছি যারা 90 এর দশকের মাঝামাঝি সময়ে সায়মন মার্লো , সিগবজর্ন ফিন , উইল পার্টেন এবং সাইমন পাইটন জোন্স এর মতো জিএইচসি-তে কাজ করেছিলেন ।
loop
পরিবর্তে আমার ফাংশন কল ।