text:
Talk:The Ketchup Song (Aserejé)

Austin Powers
Did anyone notice the Ketchup Song has the same dance as that performed by Doctor Evil in International Man of Mystery. Hand and foot movements match those of the Ketchup Song. Seems like a link there. Ketchup Song comes after Austin Powers, so it seems Las Ketchup copied the dance from Mike Myers. — Preceding unsigned comment added by 99.6.232.69 (talk) 05:26, 5 October 2014 (UTC)

Cripple
This poor cripple has no Wikis. Wetman 05:12, 12 Aug 2004 (UTC)
 * Not any more. Bonalaw 10:28, 12 Aug 2004 (UTC)

In France LAS KETCHUP 	 The Ketchup Song (Asereje) 	 2002 	 1 750 000 cd's http://www.infodisc.fr/S_ToutTemps.php  —Preceding unsigned comment added by 81.48.116.158 (talk) 00:32, 9 August 2008 (UTC)

Gypsy Ketchup
Why does it say Las Ketchup is a Gypsy group? There's no reference on their page.

Satanic Ketchup
This page is linked on the page on Allegations of Satanism in popular culture! Can anyone work out why?! Pennywisepeter 12:47, 14 September 2006 (UTC)
 * I have no idea, but the logical start is playing it backwards. -Litefantastic 16:45, 14 September 2006 (UTC)
 * Because for hardcore christians in South America, (not sure about Spain though), everything that is popular must be satanic. So they said Aserejé was actually a demonic chant. Or whatever.--User:Revoish 20:42, 18 September 2006 (UTC)

Cosby Ketchup
The English version sound like Bill Cosby's Pokemon rant in The Simpsons... 201.239.183.124 05:57, 9 October 2006 (UTC)

Gibberish
Just to be sure, "Aserejé" isn't a Spanish word but as meaningless as "hippityhop" in English? Maikel (talk) 07:56, 22 January 2008 (UTC)

Can someone pleas point out the origins of the song, I believe they knew an old man who used to sing rappers delight without actually knowing the words because he only spoke spanish — Preceding unsigned comment added by 71.22.113.106 (talk) 05:15, 14 November 2012 (UTC)

Cleanup
I have tagged this article for cleanup. I'd do it myself but my Spanish isn't good enough for me to grasp the finer points of the Spanish original. Thanks. Maikel (talk) 08:21, 22 January 2008 (UTC)
 * the article doesn't distinguish between the Spanish ("Aserejé") and English versions; for example the description of the song's "plot" refers to the Spanish version
 * the article claims that the chorus "Aserejé ja de jé de jebe" is a transliteration of the chorus of "Rapper's Delight" ("I said a hip hop the hippie the hippie") although this is patently untrue (e. g. because there is phonetic equivalent for "hip hop")

Fair use rationale for Image:Las ketchup.jpg
Image:Las ketchup.jpg is being used on this article. I notice the image page specifies that the image is being used under fair use but there is no explanation or rationale as to why its use in this Wikipedia article constitutes fair use. In addition to the boilerplate fair use template, you must also write out on the image description page a specific explanation or rationale for why using this image in each article is consistent with fair use.

Please go to the image description page and edit it to include a fair use rationale. Using one of the templates at Fair use rationale guideline is an easy way to ensure that your image is in compliance with Wikipedia policy, but remember that you must complete the template. Do not simply insert a blank template on an image page.

If there is other fair use media, consider checking that you have specified the fair use rationale on the other images used on this page. Note that any fair use images lacking such an explanation can be deleted one week after being tagged, as described on criteria for speedy deletion. If you have any questions please ask them at the Media copyright questions page. Thank you.

BetacommandBot (talk) 22:34, 13 February 2008 (UTC)

Original research
No references, so I'm removing this dubious original research:

...which happens to be the 1979 rap hit "Rapper's Delight" by Sugarhill Gang. The first verse of Rapper's Delight: "I say the hip hop, the hippie...", pronounced phonetically in Spanish the way it would sound to someone who does not understand English, becomes the chorus of The Ketchup Song. Although technically meaningless and sometimes referred to as gibberish, the chorus is a more-or-less phonetic pronunciation of the first verse almost in its entirety. The song has a very fast tempo of 185 beats per minute.

 * I said a hip hop, the hippie, the hippie:Aserejé ja de jé de jebe
 * do the hip hip hop, a you don't stop:tu de jebere sebiunouva
 * the rockin' to the bang bang boogie say up jumped the boogie:majabi an de bugui
 * to the rhythm of the boogie, the beat:an de buididipí

The similarity after the first line really isn't that close. Stevage 08:39, 3 March 2012 (UTC)

Nonsense
Quote: Finally, the word "Ketchup" ends with "up" (symbolically, heaven) and ends with "chet" (if pronounced quickly, shit), that if they are joined together it literally means that heaven is shit, a direct attack to the religious belief.

I have removed this sentence as it makes no sense. Maikel (talk) 23:52, 2 December 2015 (UTC)

External links modified
Hello fellow Wikipedians,

I have just added archive links to 2 one external links on The Ketchup Song (Aserejé). Please take a moment to review my edit. If necessary, add after the link to keep me from modifying it. Alternatively, you can add to keep me off the page altogether. I made the following changes:
 * Added archive http://web.archive.org/web/20140227140115/http://terra.es/ocio/articulo/html/oci16323.htm to http://terra.es/ocio/articulo/html/oci16323.htm
 * Added archive http://web.archive.org/web/20080118103308/http://www.rt100.ro/top-100-edition.html to http://www.rt100.ro/top-100-edition.html

When you have finished reviewing my changes, please set the checked parameter below to true to let others know.

Cheers.—cyberbot II  Talk to my owner :Online 19:11, 26 February 2016 (UTC)

External links modified
Hello fellow Wikipedians,

I have just modified 4 external links on The Ketchup Song (Aserejé). Please take a moment to review my edit. If you have any questions, or need the bot to ignore the links, or the page altogether, please visit this simple FaQ for additional information. I made the following changes:
 * Added archive https://web.archive.org/web/20140312152306/http://www.austriancharts.at/2002_single.asp to http://www.austriancharts.at/2002_single.asp
 * Added archive https://web.archive.org/web/20110510075435/http://www.disqueenfrance.com/fr/pag-259376-Classements-Annuels.html?year=2002 to http://www.disqueenfrance.com/fr/pag-259376-Classements-Annuels.html?year=2002
 * Added archive https://web.archive.org/web/20120911235310/http://austriancharts.at/2003_single.asp to http://www.austriancharts.at/2003_single.asp
 * Added archive https://web.archive.org/web/20141106031638/http://www.infodisc.fr/S_Certif_Diamant.php?debut=30 to http://www.infodisc.fr/S_Certif_Diamant.php?debut=30

When you have finished reviewing my changes, you may follow the instructions on the template below to fix any issues with the URLs.

Cheers.— InternetArchiveBot  (Report bug) 08:33, 21 May 2017 (UTC)

title: Talk:The Ketchup Song (Aserejé)


text:
Krubera Cave

Krubera Cave (კრუბერის გამოქვაბული or კრუბერის ღრმული, Ӡоу Аҳаҧы; also known as Voronya Cave, sometimes spelled Voronja Cave) is the second-deepest-known cave on Earth, after the Veryovkina Cave. It is located in the Arabika Massif of the Gagra Range of the Western Caucasus, in the Gagra District of Abkhazia, a partly recognised state, previously part of Soviet Georgia. The difference in elevation of the highest cave entrance (Arbaika) and its deepest explored point is 2199 +/-. It became the deepest-known cave in the world in 2003 when the expedition of the Ukrainian Speleological Association reached a depth of 1910 m which exceeded the depth of the previous deepest-known cave, Lamprechtsofen, in the Austrian Alps, by 80 m. In 2006, for the first time in the history of speleology, the Ukrainian Speleological Association expedition reached a depth greater than 2000 m, and explored the cave to -2080 m. Ukrainian diver Gennadiy Samokhin extended the cave by diving in the terminal sump to 46 metres' depth in 2007 and then to 52 m in 2012, setting successive world records of 2,191 m and 2,197 m, respectively. Krubera is one of the two known caves on Earth deeper than 2,000 metres.

Naming
Soviet speleologists who explored the cave in the 1960s named it for Russian geographer Alexander Kruber. The alternate name "Voronya Cave", "Crows' Cave" in Russian, was a name given to the cave by Kyiv speleologists during the 1980s, for the crows nesting in the entrance pit.

Location and background
The Arabika Massif, the home of Krubera (Voronya) Cave, is one of the largest high-mountain limestone karst massifs in the Western Caucasus. It is composed of Lower Cretaceous and Upper Jurassic limestones that dip continuously southwest to the Black Sea and plunge below the modern sea level. To the northwest, north, northeast, and east, Arabika is bordered by the deeply incised canyons of Sandripsh, Kutushara, Gega and Bzyb rivers. The Bzyb River separates Arabika from the adjacent Bzybsky Massif, another outstanding karst area with many deep caves, including the Snezhnaja-Mezhonogo-Iljuzia System (-1753 m) and Pantjukhina Cave (-1508 m). To the southwest, Arabika borders the Black Sea. The Arabika Massif has a prominent high central sector with elevations above the tree line at ~1800 - 1900 m. This is an area of classical glaciokarstic landscape, with numerous glacial trough valleys and cirques, with ridges and peaks between them. The bottoms of trough valleys and karst fields lie at elevations of 2000 - 2350 m, and ridges and peaks rise to 2500 - 2700 m. The highest peak is the Peak of Speleologists (2705 m) but the dominant summit is a typical pyramidal horn of the Arabika Mount (2695 m). Some middle- to low-altitude ridges covered with forest lie between the central sector and the Black Sea. A plateau-like middle-altitude outlier of the massif in its south sector is Mamzdyshkha, with part of the plateau slightly emerging above the tree line. Among several hundred caves known in the Arabika Massif, fifteen have been explored deeper than 400 m and five deeper than 1,000 m. Krubera Cave is located at 2,256 m above sea level in the Ortobalagan Valley, a perfectly shaped, relatively shallow, glacial trough of the sub-Caucasian stretch, which holds the advanced position in the Arabika's central sector relative to the seashore. Since 1980, Ukrainian cavers have been undertaking systematic efforts in exploring deep caves in the Ortobalagan Valley, resulting in exploration of the Krubera Cave to its current depth and of the surrounding caves, now mostly connected to it. Another deep cave in the valley, located in its very upper part and explored by Moldavian and Ukrainian cavers is Berchilskaya Cave, 770 m deep. All large caves of the Ortobalagan Valley likely belong to a single hydrological system, connected to large submarine springs at the Black Sea shore.

Geology
The Ortobalagan Valley extends along the crest of the Berchil'sky anticline, which gently plunges northwest. The cave entrances are aligned along the anticlinal crest (Figure 2) but the caves are controlled by longitudinal, transverse, and oblique fractures and faults and exhibit complex winding patterns in the plan view, remaining largely within and near the anticlinal crest zone. The caves are predominantly combinations of vadose shafts and steep meandering passages, although in places they cut apparently old fossil passages at different levels (e.g., at -2100 - 2040 m in Kujbyshevskaja and Krubera caves, -1200 - 1240 m and -980 - 1150 m in the non-Kujbyshevskaja branch of Krubera Cave, etc.). The deep parts of Krubera display a more pervasive conduit pattern with a mixture of phreatic morphology, characteristic of the zone of high-gradient floods, which can be up to 400 m above the low-flow water table, and vadose downcutting elements that are observed even below the water table. The core part of the Arabika Massif is composed of the Upper Jurassic succession resting on the Bajocian Porphyritic Series, which includes sandstones, clays and conglomerates at the top, and tuff, tuffaceous sandstones, conglomerates and breccia, porphyry and lava. The Porphyritic series forms the non-karstic basement of Arabika, which is exposed only on the northern and eastern outskirts, locally in the bottoms of the Kutushara and Gega River valleys. In the central part of Arabika the Cretaceous cover (Valanginian and Hauterivian limestones, marls and sandstones) is retained only in a few ridges and peaks, but it lies intact through the low-altitude ridges to the south-west of the central part. There the Cretaceous succession includes Barremian and Aptian–Cenomanian limestones and marly limestones with abundant concretions of black chert. The Upper Jurassic succession begins with thin-bedded Kimmeridgian–Oxfordian cherty limestones, marls, sandstones and clays, which are identified in the lower part of Krubera Cave. Above lies the thick Tithonian succession of thick-bedded limestones with marly and sandy varieties. Sandy limestones are particularly abundant through the upper 1,000 m sections of deep caves of the Ortobalagan Valley. The tectonic structure of Arabika is dominated by the axis of the large sub-Caucasian anticline (oriented NW–SE), with the gently dipping southwestern mega-flank, complicated by several low-order folds, and steeply dipping northeastern flank (Figure 3). The axis of the anticline roughly coincides with the ridge bordering the Gelgeluk Valley to the north. Located on the southwestern flank of the major anticline is another large one (Berchil'sky), in which the crest is breached by the Ortobalagan Valley. There are several smaller sub-parallel anticlines and synclines farther southwest, between the Berchil' Ridge and the coast. The plicative dislocation structure of the massif is severely complicated by faults, with the fault-block structure strongly controlling both cave development and groundwater flow. Major faults of the sub-Caucasian orientation delineate several large elongated blocks that experienced uplift with different rates during Pliocene and Pleistocene. This had a pronounced effect on the development of deep groundwater circulation and of Krubera Cave in particular. Both longitudinal and transverse faults and related fracture zones play a role in guiding groundwater flow; the latter guide flow across the strike of major plicative dislocations, from the central sector toward the Black Sea.

Cave entrances
The cave has six entrances, in the gallery below they are arranged by altitude, highest to lowest, after the main one. All are situated above the tree line.

Hydrogeology
Major on-shore karst springs with individual average discharges of 1 to 2.5 m3/s are located at altitudes ranging from 1 m (Reprua Spring) to 540 m (Gega waterfall). Two of them are located in the shore area; these are Reprua (average discharge 2.5 m3/s; altitude 1 m above sea level) and Kholodnaja Rechka (1.2 m3/s; 50 m a.s.l.). Two more major springs are located in the river canyons bordering Arabika to the east: Goluboe Ozero in the Bzyb canyon (2.5 m3/s; 90 m a.s.l.) and Gega waterfall in the Gega canyon (1 m3/s; 540 m a.s.l.). There are also several smaller springs in the Gagra town. The Reprua River, one of the shortest rivers in the world, about 60 ft long, starts in the cave and flows toward the Black Sea. Some boreholes located along the shore of the Black Sea yield karstic groundwater from depths of 40–280 m below sea level. Other much deeper boreholes tapped low-salinity karstic waters at depths of 500 and 1,750 m in the Khashupse Valley near Gantiadi and 2,250 m near Gagra. This suggests the existence of a deep karst system and vigorous karst groundwater circulation at depth. Submarine springs are known in the Arabika area, emerging from the floor of the Black Sea in front of the massif. Shallow springs at depths of 5–7 m can be reached by free dive near Gantiadi. Tamaz Kiknadze (1979) reported submarine springs near the eastern part of Gagra at depth of 25–30 m and Buachidze and Meliva (1967) revealed submarine discharge at depths up to −400 m by hydrochemical profiling. Recently an outstanding feature of the sea floor topography near Arabika has been revealed from a digital bathymetric map that combines depth soundings and high-resolution marine gravity data. This is a huge submarine depression in front of the Zhovekvara River mouth, which has dimensions of about 5 x 9 km and a maximum depth of about 380 m. The Arabika Submarine Depression is a closed feature with internal vertical relief of about 120 m (measured from its lowest rim) separated from the abyssal slope by the bar at a depth of about 260 m. It has steep northern and northeastern slopes (on the side of the massif) and gentle south and southwestern slopes. Its formation is apparently karstic. Presently this depression seems to be a focus of submarine discharge of the karst systems of Arabika. The speleological explorations and a series of dye tracing experiments conducted during the 1980s under the coordination of Alexander Klimchouk have radically changed previous notions of the hydrogeology of Arabika, revealed its outstanding speleological perspectives and strongly stimulated further efforts for exploration of deep caves. Tracers injected in the Kujbyshevskaja Cave and the Iljukhina System were detected in the Kholodnaja Rechka and Reprua springs, proving groundwater flow to the south-southwest across major tectonic structures over a distance of 13–16 km as the crow flies (Figure 1). The tracer from Kujbyshevskaja Cave was also detected in a borehole located between these two springs, which yields groundwater from a depth of 200 m below sea level. This has been interpreted as an indication of the connection of the cave with the submarine discharge. The large "Central Karst Hydrologic System", which encompasses most of the southeastern flank of the Arabika anticline, had been identified in this way. The system became the deepest in the world with its overall vertical range of about 2500 m (measuring to the borehole water-bearing horizon) or even 2700 m (measuring to the deepest reported submarine discharge points). Another tracer was injected in the Moskovskaja Cave (−970 m) and detected at the Gegsky Vodopad spring, indicating the presence of a karst hydrologic system comprising the northeastern flank of the Arabika anticline (the "Northern System"). No connections have been revealed with yet another major spring, Goluboje Ozero in the Bzyb River canyon, although it apparently drains a large area of the eastern sector of the massif (the hypothetical "Eastern Karst Hydrological System"). It is not clear where Sarma Cave (−1,550 m) drains to, Goluboje Ozero to the southeast or Reprua to the southwest, at the shore. The results of the dye-tracing tests demonstrated that groundwater flow is not subordinate to the fold structure but is largely controlled by faults that cut across the strike of major folds, and that the large part of the central sector of Arabika is hydraulically connected to the springs along the seashore and with submarine discharge points. Krubera Cave has an extremely steep profile and reveals a huge thickness of the vadose zone. The lower boundary of the vadose zone (the top of the phreatic zone) is at an elevation of about 110 m at low flow, which suggests a low overall hydraulic gradient of 0.007-0.008. Low-TDS groundwater is tapped by boreholes in the shore area at depths of 40–280, 500, 1,750, and 2,250 m below sea level, which suggests the existence of a deep flow system with vigorous flow. Submarine discharge along the Arabika coast is reported at depths up to ~400 m b.s.l. It is difficult to interpret these facts in terms of the development of karst systems controlled by contemporary sea level, or within the range of its Pleistocene fluctuations (up to −150 m). In combination with the existence of the Arabika Submarine Depression, all these facts point to the possibility that karst systems in Arabika could have originated in response to the Messinian salinity crisis (5.96–5.33 Ma) when the Black Sea (Eastern Paratethys) could have almost dried up, as did the adjacent Mediterranean, where the dramatic sea level drop of ~1,500 m is well established.

Biology
The biocenosis of Krubera-Voronja is composed of more than 12 species of arthropods of several groups, such as pseudoscorpions, spiders, opiliones, crustaceans, springtails, beetles and dipterans. Krubera-Voronja cave is inhabited by endemic species, including four springtails discovered during the CAVEX Team expedition of 2010: Anurida stereoodorata, Deuteraphorura kruberaensis,  Schaefferia profundissima, and Plutomurus ortobalaganensis; the last of these is the deepest terrestrial animal ever found on Earth, living 1980 m below the cave entrance. The beetle Catops cavicis inhabits Krubera-Voronja cave and also several caves around the Ortobalagan Valley. The subterranean amphipod crustacean Kruberia abchasica caught by Gennady Samokhin in August 2013, during dives in the siphon 'Dva Kapitana', dwells at the deepest part of the Krubera Cave (at the depth of −2,175 metres).

Early exploration
At the beginning of the 20th century, Arabika was visited by French speleologist Édouard-Alfred Martel, who published several works about the massif. In 1909–10 Russian karst scientist Alexander Kruber, a founder of the study in Russia, performed some field studies in Arabika. He published his observations in a series of Arabika-specific papers  and several monographs. During the subsequent 50 years no special studies were undertaken of the karst and caves in the region, although the karst of Arabika was referred to in many works dealing with regional geology and hydrogeology.

1960s
In the early 1960s, Georgian geographers led by Levan Maruashvili began exploring caves in the high sector of the massif. Among several other caves, they made the first exploration of an open-mouthed 60 m shaft in the Ortobalagan Valley and named it after Alexander Kruber. The first explorers were stopped by impassable squeezes at −95 m in a meandering passage which led off from the foot of the entrance shaft. The cave remained largely neglected over the next 20 years, although occasionally visited by cavers from various caving clubs. Before 1980 there were no caves deeper than 310 m known in Arabika.

1980s
The new era in cave explorations in the Arabika Massif began in 1980 when the Kyiv Speleological Club, led by Alexander Klimchouk, started exploring caves there. They adopted an approach to cave search and exploration which included thorough investigations in a defined area and systematic testing of cave limits, through digging in boulder chokes and enlarging squeezes which had previously obstructed exploration. The Ortobalagan Valley had been selected as a primary focus for the Ukrainian efforts. This approach, followed in subsequent years by other caving clubs which joined exploration activity in different parts of Arabika, resulted in the discovery of many deep caves including five caves deeper than 1,000 m. In the Ortobalagan Valley, the Ukrainian cavers made breakthroughs in Kuybyshevskaya Cave at −160 m and pushed it to -1110 m by 1986 through a series of massive boulder chokes. They broke through an impassable squeeze at −120 m in Genrikhova Bezdna Cave and eventually connected it to Kuybyshevskaya at −956 m in 1987. The resultant system has been named the Arabikskaya System. From 1982 onwards, the Kyiv cavers started systematically working in Krubera Cave, located less than 200 metres from the Kuybyshevskaya entrance, hoping to connect with the Arabikskaya System and increase its total depth by 60 m. Exploration progressed slowly because critically tight meanders between the pits required enormous amounts of work to widen them to a passable size. The cave was pushed to −340 m during 1982–1987. Two "windows" in a vertical shaft at depths of 220–250 m were documented on the cave map but remained unexplored. During this time the cave received its second, alternative name Voronja (Crows') Cave, owing to the number of crows nesting in the entrance shaft.

1990s–early 2000s
The political and ethnic conflict in Abkhazia during 1992–94 resulted in instability and border problems which continued over subsequent years. This suspended speleological explorations in Arabika. Some stabilization of the situation in 1998 has since enabled a renewal of exploration effort to take place in the region. In 1999, the expedition of the Ukrainian Speleological Associations (Ukr. S.A.) led by Jurij Kasjan (also spelled Yuriy Kasyan) made a major breakthrough in Krubera Cave by discovering and exploring two branches behind the windows at a depth of 220–250 m. These branches stretched in two different directions. The "Main Branch" was explored to −740 m and the "Nekuybyshevskaya Branch" to −500 m. In 2000, the Main Branch was quickly pushed by the multi-stage expedition of the Ukr. S.A. in August to −1,200 m and in September to −1,410 m. In January 2001, the Ukr.S.A. expedition explored the cave to -1710 m making it the deepest cave in the world. For the first time in the history of speleology, the deepest cave in the world had been established outside of western Europe. Since 2001, the Krubera explorations by the Ukr.S.A. have been undertaken within the frame of the multi-year project named "The Call of the Abyss", coordinated by A. Klimchouk, Y. Kasyan, G. Samokhin and K. Markovskoy. Besides the Ukrainian speleologists, cavers from many countries such as France, Spain, Russia, Moldova, Bulgaria, United Kingdom, Ireland, Israel and Lithuania have taken part in different expeditions of the Ukr.S.A.

2001 onwards
The major events in the exploration of Krubera Cave in subsequent years were as follows (see Figure 4 for spot locations):

2001

 * August: the Ukr.S.A. expedition led by Jurij Kasjan. Four underground camps established in the cave: in the Main Branch at −500, −1,200 and −1,400 m and in the Nekujbyshevskaja Branch at −500 m. Systematic inspection and probing of potential leads in the deep sections of the Main Branch; climbing in the Lamprechtsofen tributary; digging in the boulder choke in the Nekuybyshevskaya Branch.

2003

 * August: the expedition of the Kyiv Speleological Club and the CAVEX team. Tested and passed a sump at −1,440 m (now known as Sump 1), explored the post-sump section to roughly −1,660 m, continued climbing in the Lamprechtsofen tributary.

2004

 * July: the CAVEX team started their separate explorations, beyond the Ukr.S.A. project, in Krubera Cave. Continued exploring a section beyond Sump 1 at −1,410 m and reached the next sump (Sump 2 – "Blue Lake") at depth claimed to be −1,840 m. The depth of that point according to the subsequent Ukr.S.A. survey is −1,775 m.
 * August: the Ukr.S.A. expedition led by Nikolay Solovyov and Alexander Klimchouk. In the Main Branch, surveyed the post-sump series, established a camp at −1,640 m, discovered a lead to a new section ("The Way to the Dream") and explored to −1,840 m. Explored the Uzhgorodskaya Series in the upper part of Krubera by climbing an 80 m high shaft in the Meander Krym. Continued working in the Nekuybyshevskaya Branch.
 * October: the Ukr.S.A. expedition led by Jurij Kasjan. In the Main Branch, discovered a lead into a new section beyond the Big Junction at −1,790 m. Explored this section named "Windows" to a blind chamber called "Game Over" at −2,080 m. The depth mark of 2,000 m had been passed for the first time in the history of speleology.

2005

 * February–March: the Ukr. S.A. expedition led by Jurij Kasjan. In the Main Branch, continued exploring the "Windows" series where many side leads and several sumps were tested. A sump at −1,980 m called "Kvitochka" was passed by Nikolay Solovyov, and a continuation found behind it.
 * July: the CAVEX team expedition. Explored the section beyond the Kvitochka Sump to a further sump called Dva Kapitana ("Two Captains") at −2,140 m.
 * August: the Ukr. S.A. expedition led by Nikolay Solovyov. Continued digging and broke through the boulder choke at −500 m in the Nekuybyshevskaya Branch, explored it to the next boulder choke at −640 m.
 * October: the Ukr.S.A. expedition led by Jurij Kasjan. The exploration beyond the Kvitochka Sump had been cancelled due to a sudden flood. Established a camp at −1,960 m. Performed a verification survey to −1,200 m by hydrolevelling to assess the precision of the standard Ukr.S.A. survey (the Russian Geographic Society group). Continued climbing in the Lamprechtsofen tributary to +210 m relative to the junction.

2006

 * August–September: the Ukr.S.A. expedition coordinated by Jurij Kasjan. In the Main Branch the terminal sump called Dva Kapitana ("Two Captains") was tested by Gennadiy Samokhin to depth of 17 m, which extended the total depth of Krubera Cave to 2158 m. In the Nekuybyshevskaya Branch, a group led by Kyryl Markovskoy broke through the boulder choke at −640 m and explored a continuation to −1,004 m.

2007

 * January: the CAVEX team expedition. Performed a dive in the terminal "Dva Kapitana" sump and claimed it to reach −30 m depth below the water table. However, characteristics of morphology of the underwater passage reported by the team were not confirmed by the subsequent exploration, and no safety line was found deeper than 16 m.
 * August–September: the Ukr.S.A. expedition led by Jurij Kasjan. In the Main Branch, Gennadiy Samokhin dived the terminal "Dva Kapitana" Sump for a length of 140 m and depth of −46 m, which set the new depth for Krubera Cave at 2191 m. After an elbow at -35 m the underwater passage continues to depth under steep angle. Also in the deep parts of the Main Branch, several side passages and sumps at various depths were explored. In a side branch which previously ended at −1,775 m by the "Blue Lake" sump, a series of air-filled passages was explored behind the sump, separated by six intermediary sumps. The farthest sump, "Yantarny", was explored for 130 m in length and 19.5 m in depth and continues. The deepest point in this branch has been reached at −1,841 m. In the Nekuybyshevskaya Branch, a group led by Kyryl Markovskoy continued exploring new leads and extended the depth of this branch to −1,293 m.

2008

 * September: the Ukr.S.A. expedition led by Jurij Kasjan. Explored the Nekuybyshevskaya Branch to depth of 1390 m. An international scientific expedition "Towards the Centre of the Earth", led by Lithuanian Aidas Gudaitis (Aenigma), descended the main branch as far as -1800 m, placing water level loggers at siphons here and in the "Chamber of Soviet Speleologists" at -1710 m.

2009

 * August–September: the Ukr.S.A. expedition led by Jurij Kasjan further pushed the Nekuybushevskaya Branch to a siphon at depth of 1557 m. The international "Towards the Centre of the Earth" expedition led by Aidas Gudaitis returned to the main branch to collect data from water level loggers, swap their locations and push exploration in the "Spanish branch" near camp 1400. 2008–2009 data collected from 1,710 m and 1,800 m indicated that the sump levels rose in two distinct periods: continuously from May–July 2009 and with an isolated pulse in October 2008, both sumps reaching a maximum flood depth of 12 m. New logger locations at depths of 1,800 m, 1,980 m (Kvitochka sump) and 2,140 m (Dva Kapitana's sump).

2010

 * July–August: The CAVEX Team Summer expedition led by Konstantin Mujin performed the first biospeleological studies in the Krubera-Voronya cave. The biospeleological studies led by the cave biologists Ana Sofia Reboleira and Alberto Sendra, provided the deepest subterranean arthropods of the Earth.
 * August: During "Towards the Centre of the Earth" expedition led by Aidas Gudaitis, a Lithuanian member of Aenigma caving club Saulė Pankienė became the first woman to dive Kvitochka sump at 1,980 m, and subsequently to descend to the "Two Captains" sump at a depth of 2140 m. Water level measurement results of 2009–2010, collected during this expedition, showed that the water level rose up to 228 m above the sump "Two Captains" during June 2010. Data logging devices were installed by Irish members of the expedition near to the entrance of the cave, to log surface conditions and enable correlation of data between surface and underground locations. "Spanish Branch" exploration was completed and a limit was reached with 131 m total passage surveyed.

2012

 * August: A team of 59 spent 27 days exploring Krubera. Including members from nine different countries, the team set up a series of camps underground. Ukrainian cave diver Gennady Samokhin was responsible for reaching a new world depth record of -2199 m.

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

title: Krubera Cave


text:
Blat

Blat or BLAT may refer to:

 * BLAT (bioinformatics), an algorithm
 * Blat (favors), a form of corruption in Russia and the Soviet Union
 * Blat (Romania), a term denoting a fixed match in Romanian football
 * Blat (software) is a Windows command line utility that sends email using SMTP or posts to Usenet using NNTP.
 * Blat, Byblos District, a village in Mount Lebanon Governorate, Lebanon
 * Blat, Marjayoun a village in Marjeyoun District, Lebanon
 * Caio Blat (born 1980), Brazilian actor

title: Blat


text: User talk:68.42.130.227

title: User talk:68.42.130.227


text:
Talk:Coroutine

Ruby coroutines
Doesn't Ruby have coroutines? Someone should mention that. --68.35.244.188 05:25, 12 Aug 2004 (UTC)

Python also has coroutines, in the form of the recently (Python 2.3) added generator function. It even has a yield keyword. This could be used to build an excellent example for this article. —Preceding unsigned comment added by 138.38.32.84 (talk • contribs) 2004-11-03 13:26:19

Why did nobody add them? Is there a controversy about whether they really have coroutines?--87.162.67.249 22:13, 9 September 2007 (UTC)

 * I am not expert in Ruby, but I believe it has only continuations, not coroutines as such. There is a slight difference. Samohyl Jan 05:32, 10 September 2007 (UTC)

"Editorial" section removed
I removed the content of the Editorial section, on the grounds that it does not belong in an encyclopedia. I agree that the remaining content in the article is written from a POV that favors the use of coroutines, but the way to fix that is to rewrite the article from NPOV, not add a rebuttal to the article itself. The content follows. Neilc 04:35, 24 Oct 2004 (UTC)

Editorial
The author of this article clearly has a preference for coroutines over the more popular structures in modern, commercial programming languages. Popularity is by no means a justification for something. However, in this case the alternatives to coroutines are popular for good reason.

Coroutines allowed the "thread of execution", however it is implemented, to enter a function, process it for a while, return to the caller, and go back to the function where it left off while maintaining the state of local variables. This all sounds very useful. It is not. There are much better ways of accomplishing whatever task you wish to perform. I will address some of the issues the author mention above.

In situations in which a coroutine would be the natural implementation of a mechanism, but is not available, the typical response is to create a subroutine that uses an ad-hoc assemblage of boolean flags and other state variables to maintain an internal state between calls.

It is true that most procedural and object-oriented programming languages don't let you jump to the middle of a function. You can in standard Pascal using a goto statement, but it is a bad practice. It is such a bad practice that Borland prohibited it in its Turbo Pascal compiler.

Object-oriented languages such as Java and C++ provide a far more elegant solution. Encapsulate the state information and the operations in a class. The internal state persists between calls to the method because the internal state is associated with members of the class.

 * Object-oriented languages do not specifically provide a more elegant solution. You might as well argue that threads as a whole are unnecessary because you can model any number of threads in your application instead with a state machine.  This is not eloquent -- using a state machine imperatively to simulate threads.  It is much better and easier to write each object such that each object /believes/ it is in its own thread.  This is much more natural than writing state machines.  You should consider reading: http://www.stackless.com/ —Preceding unsigned comment added by 24.175.26.71 (talk • contribs) 2005-10-07 06:43:25

''Threads resemble coroutines on steroids. Threads provide facilities for managing the realtime cooperative interaction of "simultaneously" executing pieces of code. Because they solve a large and difficult problem, they include many powerful and complex facilities and have a concomitantly difficult learning curve. When a coroutine is all that is needed, using a thread seems like overkill.''

I do not consider threads to be complex, difficult to learn how to use, or overkill. Multithreaded programming was always simpler than using interprocess communication. In languages like Java, multithreading is extremely simple and easy to use. Two lines of code.

Thread myThread = new Thread(objectThatImplementsRunnable, "My Thread's Name"); myThread.start;

You can even combine these two lines of code into one if you like. So easy. And despite being so easy, threads are extremely efficient. Context switching is almost non-existent in threads. Plus you get pre-emptive multitasking, thread priority, and suspend/resume capability for free.

Threads and object-oriented programming are the way to go. Coroutines may be a nifty concept, but they can't do anything that threads and classes can't do more eloquently.

 * Coroutines are for many tasks easier than threads. Consider for instance you want to program a state machine. Without threads or coroutines, you need to remember state, and with each call of the procedure implementing state machine make a jump by the state. This will result in somewhat clumsy and hard-to-read code, because entry point must know how to deal with all states, not only outgoing ones. With threads, you could do this, but you also have to explicitly synchronize them (because you really don't need concurrency for this task). But coroutines make implementation of this easy and natural. For instance, this can be used to program agents in games, where each agent is essentially a state machine, and they interact. Then it nicely separates code for each agent from the rest (main loop), without hassle about synchronization and locking, because they are in fact executed sequentially. Samohyl Jan 10:36, 26 August 2005 (UTC)
 * I agree with this. You're missing the point if you think that coroutines and threads are tools for the same purpose.  They are most certainly not.  Pointedly, coroutines can be used (such as in Stackless Python) to provide thread-like behavior for a massive number of independent objects.  For example, you could have 100,000 objects each of which is written in a thread-like manner.  No real OS could manage that number of threads in a practical way.  However, you can write such a system with coroutines.  Note that your result is effectively cooperative multitasking, where threads traditionally use pre-emptive multitasking. —Preceding unsigned comment added by 24.175.26.71 (talk • contribs) 06:40, 7 October 2005 (UTC)

Coroutines originated in languages Simula and Modula-2,
BLISS programming language - what about this ? —Preceding unsigned comment added by 195.42.89.34 (talk • contribs) 2005-12-29 13:35:45

??? For that matter, they originated before BLISS. They were a recognized assembly-language technique. In fact I think that's how Knuth presents coroutines. Dpbsmith (talk) 14:46, 29 December 2005 (UTC)

Implementation does not require garbage collector
The Detailed Comparison portion contains

 * In contrast, coroutines, able to call on other coroutines as peers, are best implemented using continuations (which in turn are implemented using a garbage-collected heap) to track the flow of control

As demonstrated by the portable coroutines library linked at the bottom of the page, you don't need a garbage-collected heap to implement continuations. There's nothing unique about a continuation as an object and in fact since in many C libraries coroutines are not copyable (I think that's generally true) and have a defined lifecycle (when the coroutine hits the end of execution, it dies), there's not even a need for reference counting. One think that's interesting about coroutines is that the memory for one can be preallocated and trivially reused (making their creation rather cheap).

I'm going to update this wording. AnthonyLiguori

called vs. peer coroutines
I don't understand the difference described in this section. I looked for the terms on Google, but I didn't find any explanation. Maybe an example (especially of language that makes this distinction) or at least a citation would be helpful. Samohyl Jan 07:27, 16 July 2006 (UTC)

(moved here)

Hi, Whiner01. Regarding your recent edits at coroutine (about peer and called coroutines). I don't understand the distinction from your description, and I tried to look for some reference of this terminology, but failed. Can you provide an example of a language that actually makes such distinction, and explain the actual difference between the two kinds of coroutines? I know coroutines in Python, and there is no need for such distinction. Samohyl Jan 18:06, 17 July 2006 (UTC)

I came across the word "coroutine" somewhere. I wanted to pin it down because so many times i encounter the term "coroutine" in contexts where it is not justified. "Coroutine" is too often a buzzword whose meaning is not known to the person using it. Google IS sparse on the term. Forgotten by many and puffed out of shape by others.

I was frustrated by an article that didn't tell me much. The discussion page shows a removal of an editorialization on whether or not coroutines are as neat as threads. Very profound.

I tried to roll in what i learned about coroutines from assembly language. I didn't want to exclude any possibilities. Some concrete examples from programming languages might help, but i worry if the language implementations don't exclude meaningful possibilities. If a language "fails to make a distinction", could it mean that they omitted a major form, or it could mean that they found a unification that was not expressed here before, and that i also missed? Can you provide a link to a good discussion of the Python implementation of coroutines?

The few examples on the page and near-at-hand are not very informative. They fail to show or tell why coroutines might be useful, and why understanding of coroutines might be educational. The similarity to subroutines is important, but so is the similarity to threads. The example(s) here don't have a complete syntax.

I re-embroidered from what was here, and so i might be out on a limb. BUT, the examples clearly fall into one style of usage or another. Some speak of "call", or at least "return"ing of values, and some speak of "yield"ing control. The discussions themselves have created two styles, with two grammars. I just spelled it out. I admit i am somewhat lost as to how coroutines are coded in a compiled language. Greater complexities come from the possibility of passing parameters. Parameters can make it so gritty, that I wonder if they bother with parameters at all.

I can easily envision a main program with a coroutine, the coroutine having the maximum resemblance to a subroutine. The coroutine declares formal parameters. The program can "call" the coroutine from many places with actual parameters. At each call, the new parameters are re-passed to the coroutine code. The co-routine starts or resumes each time it is called. It can return from many places. In most languages a subroutine can return only one value, which stores back into the main program by an assigment of the result of the coroutine call. There is an asymmetry here: the main program can jam in multiple parameters, but it can only get back one. But i guess the coroutine could modify its arguments, just like subroutines do. And one earlier assumption need not be locked in: maybe the coroutine can declare different formal parameters at each re-entry point. Why not?

Code for a coroutine -- in a language that uses only one set of formal parameters for the coroutine: Coroutine add3(a): static t do    t=a return -1 t+=a return -1 t+=a return t loop

Code for a coroutine -- in a language that uses one set of formal parameters for each [re-]entry: Coroutine add3: do   co-entry(a) return -1 co-entry(b) return -1 co-entry(c) return a+b+c loop

Putting the coroutines on a more equal standing requires a deeper rearrangement of the program syntax. Both coroutines need to have formal parameters declared -- either once at the top, or once at each re-entry. But then how does the first co-routine get started? If a co-routine has declarations at the top, then it cannot also be a main program. There has to be a stub of a main program that falls into one coroutine or the other. How does one of the coroutines get to be declared the main coroutine? Or does the main program have to call one of the coroutines? But then there are two ways in, co-call and call -- not very elegant.

If we allow that there is an "acceptor" declaration to receive formal parameters, the coding of the coroutines will show something interesting. The first co-routine to execute has a co-call before the following accept clause. All other co-routines have an accept clause preceding any co-call statement. A reminder that parameter passing complicates things? Or just a reminder that there has to be a main program.

So, how are coroutines declared in Python, etc.?

--Whiner01 06:07, 18 July 2006 (UTC)

Support of coroutines under several languages seems to consist of pages of debate on how it should be done. Support in other languages seems to involve schedulers, which is not what coroutines are supposed to be about. In other languages, coroutines "can be executed concurrently", so they are something completely unrelated to previous discussions.

--Whiner01 06:36, 18 July 2006 (UTC)

 * First, before I address your questions, I must said that I consider your changes to article very messy and confusing (both stylistically and factually). Could you please refrain from editing while we have this sorted out? As you said, you have little knowledge of coroutines yourself, so you probably should think twice before making substantial changes to this article, and also the terminology you use may well be unsuitable for Wikipedia, according to WP:OR policy (I am not such a big expert too, so that's why I am actually asking for references to support your claims or terminology).
 * To your question about Python. Python coroutines are similar to standard Python functions (which can return many values in single pass, thanks to Python tuples or dictionaries), but treated quite differently. If the coroutine is first called, it will return another callable object, which then remembers its state (both instruction pointer and local variables) and can be called repeatedly, and also another parameters can be passed into it. So the first call is very different from subsequent calls. The coroutine returns from the subsequent calls using yield keyword (which is also way how the compiler recognizes it as a coroutine). The reasons for this particular implementation are historic, but though it can look ugly from inside, the usage tends to be pretty elegant actually. The discussion of Python coroutine implementation can be found in the PEPs and.
 * I think the problem you have with coroutine is that you want them to have work in the same way as normal subroutines. But they are different - the coroutine needs to be initialized to work properly. Also, the coroutines are not here to address the problem with passing multiple parameters out of a function - you can pass structure to do that. Also, I don't think it's good idea to allow jump anywhere into the same coroutine (with perhaps different input parameters), just as it isn't a good idea to allow this for a normal function; this is an assembler way of doing things, not a high-level language way (it's almost like infamous goto statement).
 * I hope I addressed your questions. Samohyl Jan 18:02, 18 July 2006 (UTC)

 * Just to clear up things up: Python does not have true coroutines, in the sense that other coroutine-supporting languages use the term. What PEP 342 defines is a simple enhancement to Python's generator functionality, which makes it easier and more convenient to implement (some would say "emulate") what real coroutines do (that's why the PEP title is "Coroutines via Enhanced Generators").  --Piet Delport 04:15, 19 July 2006 (UTC)

I have again stumbled into a muddy topic. I can't yet cite Knuth yet because I have to go and find a paper copy of his foundational computer writings.

You are free to inject facts into the article.

For example, the very first sentence of the article contradicts your claim that coroutine is not a subroutine: "In computer science, coroutines are program components that generalize subroutines ...". (The first sentence is of course wrong. Many implementations of coroutines work that way, but a coroutine can be other things.)

The examples shown in Python also fail to provide any counter-example. They only show coroutines that are called and then return values by yielding, as if that was the only kind of coroutine.

The poorly written example in the article shows a different kind of coroutine using "yield to" which implies that the coroutine gets to decide which other coroutine it yields to! (Assuming there are more than two.) That is a distinct thing. I don't see "yield to" in any other examples. Maybe "yield to" does not exist -- but then it's not my facts that are wrong -- the example predates my edits. But coroutines go back to the assembler era, and "yield to" surely existed somewhere.

Coroutine is first of all a concept! The idea of cooperating equals. Two patches of code in the same program, both written as if they are the main program. And switching between each other instantly and effortlessly, or at least as easily subroutine calls and without ever involving a separate thread or a scheduler.

The concept quickly fragments, even before implementation begins. Coroutines can be done in assembler because everything is "roll your own". Similarly, in many languages, coroutines can be done as "roll your own" using switch statements and state variables. After that, macros to hide the ugly switch statements built into the code.

It is hard to roll all of the coroutine possibilities into a compiled language. It is easier to make an elegant version of coroutines by omitting some of the possibilities. A called coroutine fits very neatly into the compiled era. The main program can freely call subroutines and coroutines; subroutines and coroutines can freely call subroutines and coroutines. Even so, I'm surprised it took so long for a called coroutine to get some standard keywords.

Complicating the use of the term coroutine is that people are constantly finding other meanings for it. In "BETA" (i think), they talk about coroutines running "concurrently". WTF.

--Whiner01 01:31, 19 July 2006 (UTC)

 * I thought about it a little and I think I understand what you mean. When you call a coroutine in Python, it works much as a function call, ie. the return address is recorded somewhere, and you can track the path back (by yielding). But you are right, in the example and perhaps other languages it's more like a jump (or goto) into a function. So, back to the article. Perhaps we could simply say that resuming a coroutine is in some languages like a call (ie. the return address is recorded) and in other languages it is (perhaps) as a jump or goto into a function (so the return address is lost). If you agree, I will rewrite the first paragraph (after the intro) in this sense. Samohyl Jan 19:14, 19 July 2006 (UTC)

I ran out of time to tinker with this one. (Possibly an "event horizon" effect. The article stops getting needed edits or rewrites when it gets too big or complicated to edit or rewrite on one sitting.)  In the past I have gotten away with making substantial improvements to pages i did not understand, learning as i go. For example, Fat binary. I hypothesized that a utility must exist that can "remove the fat' from a fat binary. Another editor provided the fact, a utility called "lipo".  Under Coroutine, i hypothesized that there are coroutines that can return but not yield.  It apparently works that way under C#, with a "yield return" statement.

There are huge problems with the term as "Coroutine" as commonly used and discussed. There is the original notion, predating the popularity of threads and multiprocessing. Coroutines are still the ultimate lightweight thread, even in the days of threading, because of the infinitesimal consumption of resources and the instantaneous [micro-]context switching. Knuth was not the first; the idea of two main programs that trade off has been in print since 1958. Details of the original notion and Knuth's notion, which i have not yet looked up. Many many implementations, home-grown under assembler and many languages. Implementations in languages, most of which are faulty or incomplete, tedious, risky, etc. Modern non-implementations that include fake co-routines using threads, etc. People who think that their particular implementation defines the concept.

Call and Return have native hardware support and acceleration. The method of passing mountains of arguments through the same call-and-return stack is an outgrowth of necessity even for assembly-language programs, which is formalized and highly used in compiled languages. Allocating all local or temporary (non-"static") variables onto a bloated call-and-return stack is another method best managed by languages. It provides for very quick (instant) disposal of the temporary variables. (Passing data through the stack also provides for the helpful and useful "buffer overrun" errors that cross up data and addresses, making every compiled program vulnerable to hijacking.)

Coroutines are far from standardized. Coroutines have no hardware support. Support in languages, if any, is in its infancy. There are many complications and many possibilities for implementation. The possibility of parameters and return values adds its own complexity. Each implementation fails to deliver most or all of the possibilities and adds unnecessary complications of its own. Giving a coroutine every functional possibility probably complicates the support structure so much as to nullify the advantages. Implementing coroutines is supposed to be simple, but (for example) how does one allow recursive [called] coroutines? (or does recusrsing mean anything at all?)

In some languages (or pseudo-languages), you "call" a coroutine and then "resume" the coroutine. But then they say you can "call" it every time and it figures out what to do. A co-routine that does a "yield return" then has no way of actually ending -- the code can fall off the end. Does that code implicitly loop, or does the coroutine die somehow? Yield and return (or "yield return") are far different concepts.

Coroutines that are implemented allowing "yield TO" are vastly different from the callable kind. The main program becomes implicitly a coroutine that can be yielded to.

--Whiner01 08:25, 23 July 2006 (UTC)

 * See my earlier comment: what you seem to be talking about here (the feature found in C#, Python, and such), are not coroutines at all, but generators.  Even though both concepts involve control flow, and both use the word "yield" (to mean various things), they're two distinct things, using two different techniques to solve two different sets of problems.
 * (Things get slightly confused by the fact that you can implement generators in terms of coroutines, and vica versa (with a bit more trouble), but that does not make them any more similar. The situation is sort of like closures versus objects:  either can be implemented entirely in terms of the other, but despite that they don't bear much resemblance in terms of how they're usually used, implemented, and reasoned about.)  --Piet Delport 21:34, 24 July 2006 (UTC)

nop 12:32, 20 September 2007 (UTC)
 * I just wanted to know what coroutine is about. Unfortunately, the introduction was not very clear. I found that Simon Tatham's intro is far more intuitive than the gibberish cited in external links. I tried to modify the introduction to make it more comprehensive.

It's still unclear to me what the difference between generators and coroutines is. Are coroutines really supposed to direct scheduling? Are they truly forbidden from returning values? (Simon Tatham's article is very instructive, but unhelpful on this point.) If you can't explain what the difference is (other than by reference to outright snobbery) then perhaps they are actually the same concept. At which point I suppose we ought to consider merging the pages on Wikipedia…Donal Fellows (talk) 10:37, 11 September 2008 (UTC)

Lua coroutines
Someone should note that coroutines are standard in lua. —Preceding unsigned comment added by Chokosabe (talk • contribs) 2007-04-01 13:33:56

C# yield return statement
Does the yield return statement in C# fit in here? 220.245.146.199 11:47, 13 September 2007 (UTC)
 * If it specifies where it's yielding to, then yes; otherwise, add it to generator (computer science). EdC 21:43, 13 September 2007 (UTC)

Green Thread?
The definition of Green Threads seems identical to the historic definition of Coroutines. Only if you insist that a Coroutine cannot suspend in a subroutine (i.e. suspend when there is call stack or context) would there be any difference.

The term Green Thread is quite "new". Coroutines in Simula (and early C++ versions) worked exactly like Green Threads. DRW - Oct 8, 2007 —Preceding unsigned comment added by 207.59.232.138 (talk) 15:55, 8 October 2007 (UTC)

 * See green threads linas (talk) 16:01, 22 August 2009 (UTC)

Coroutines in Tcl
Tcl 8.6 will have coroutines; I've not added it to the list of programming languages yet because that's still a version in beta. Of course, it strictly has generators, but the generator semantics allows the passing of a value upon reentry after yield and a bunch of other things that makes the functionality more coroutine like, and many other languages are in the list despite being generators as well. Note that we won't have a direct “yield to”; that's considered to not fit with the way that the rest of the language operates. Donal Fellows (talk) 15:15, 8 January 2009 (UTC)

Coroutine in Scheme
FYI, I just came across a very nice, very simple, elegant example implementation of coroutines in scheme, using just a continuation and a queue, and posted it on the Talk:Continuation page. I think it deserves to be in some article somewhere, just not sure where. linas (talk) 15:58, 22 August 2009 (UTC)

reference style
I would like to consistently use  tempalates and   in this article. The former for consistency and the latter for decluttering the text. I've started on this effort and plan to continue if there are no objections; so feel free to revert and set me straight here! Thanks, ErikHaugen (talk) 21:00, 26 October 2010 (UTC)

coexpressions in Icon
For anyone feeling that the historical role of Ralph Griswold et al Icon programming language is not given its due here, I would note the recent changes to the implementation in Robert Parlett's ObjectIcon at code.google.com/p/objecticon

I have added a link to CLU at the Icon article

G. Robert Shiplett 00:06, 16 June 2012 (UTC)

Use in Game Development
Coroutines are a useful pattern for game development. In this area, one often wants to expose a scripting-language to designers or developers, without giving them access to threading mechanisms which require careful tuning and centralized control for high-performance. The rendering-frame or simulation frame (typically from 15 Hz to 60 Hz) means that most tasks need to be broken-up into actions that can happen in (much) less than the frame time. Storing state in objects, as mentioned in the editorial section, is one way to do this, but leads to a proliferation of boiler-plate code. For instance, creating state enums, switching on the object's current state, etc. Code can be clearer, and therefore more maintainable if it is visible at a glance, has straight-line flow, and is contained in a few-line coroutine, rather than dispersed through multiple locations in the sources.

Coroutines in the Unity Game Engine: http://docs.unity3d.com/Documentation/Manual/Coroutines.html

Coroutines in Lua (an often used extension-language for games): http://www.lua.org/pil/9.1.html

Jawa0 (talk) 15:20, 1 November 2013 (UTC)

Stale external link
The external links section contains a stale reference to [explanation of coroutines. This URL no longer works. [[User:Bouvierjr|JR Bouvier]] (talk) 17:49, 30 December 2013 (UTC)
 * I removed it; feel free to fix stuff. ErikHaugen (talk | contribs) 18:43, 30 December 2013 (UTC)

Clarification please
I can't make sense of this sentence:

 * The difference between calling another coroutine by means of "yielding" to it and simply calling another routine (which then, also, would return to the original point), is that the latter is entered in the same continuous manner as the former.

Also, the term "yield" is not properly introduced before it's used. Encyclopedant (talk) 23:45, 4 August 2014 (UTC)

External links modified
Hello fellow Wikipedians,

I have just modified 1 one external link on Coroutine. Please take a moment to review my edit. If you have any questions, or need the bot to ignore the links, or the page altogether, please visit this simple FaQ for additional information. I made the following changes:
 * Corrected formatting/usage for http://www.ruby-forum.com/topic/126011

When you have finished reviewing my changes, please set the checked parameter below to true or failed to let others know (documentation at ).

Cheers.—cyberbot II  Talk to my owner :Online 01:35, 1 April 2016 (UTC)

Emulating with trampoline
You say that generators are weaker since their yield supplies no label to jump to. You immediately demonstrate that `yield to consumer` can be emulated with generators by `yield consumer`. This is a joke to me. You had to drop `to consumer` instead of only `to` particle in order to transform the code into generators. How does dropping `to` particle work? --Javalenok (talk) 06:25, 7 December 2016 (UTC)

C++ coroutines TS
A new entry is needed under the C++ section, namely the coroutines TS (technical specification). It proposes a C++ standard for stackless coroutines that will very likely be in C++20. Three major compilers, Visual C++, gcc, and Clang already support major portions, in the std::experimental namespace. Here's a link to the TS: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/n4680.pdf — Preceding unsigned comment added by 2600:1700:E840:AC40:64DB:84F0:639C:A8E3 (talk) 00:02, 29 March 2018 (UTC)

Programming languages with native support
While seeking information, I found a questionable citation that I replaced with a better URL, which only illustrates a technique. The questionable citation was introduced in 2013. --Ancheta Wis   (talk  | contribs) 13:36, 13 January 2019 (UTC)

Definition
What are the defining features of a coroutine? (How do different authors theoretically define coroutines, and do different major programming languages differ in what sort of object is/isn't termed a coroutine?)

For example are all these neccessary and sufficient for a block of code to be a general coroutine:
 * Multiple entry points (not only the beginning of the block). (Is this always implemented as a statement that temporarily yields control then resumes at the following line?)
 * Repeated bidirectional information passing i.e. the code can send new information each time it yields control, and can receive new information each time it resumes execution. (Presumably this piece of information is always sent to/from the same section of code as which control is passing to/from at that same instant?)
 * Retention of state (local variables) while the block of code is suspended. (Is this implemented differently from the typical stack?)
 * Ability for that block of code to yield control to other than its own caller. (?)

How are coroutines different from subroutines that call other subroutines? (I.e. a call statement cooperatively passes control to someplace else, and later the execution may resume from the next line). Is the difference that subroutines have a hierarchical stack structure (i.e. a subroutine can call a new subroutine or return to its own caller, but cannot directly pass control back to another routine that is deeper in the call stack)? Do coroutines facilitate flow graphs containing cycles?

Does "coroutine" have any meaning in entirely functional, rather than proceedural, programming paradigms (say, Lisp, Mathematica)?

In object-oriented programming, is message-passing (method calling) between objects a full implementation of coroutines? (Is it a problem that calling a send/receive method will always pass control to the start of that method?)

Does making full use of coroutines require launching them from an event loop (like in Python)?

The original 1963 coroutines paper seems to describe communication between coroutines as analogous (in syntax) to how a traditional program makes IO (read/write) calls. They were intended for multistage data processing pipelines, letting different-stage modules run concurrently/asynchronously so that data can be streamed through the entire pipeline in a single pass (akin to nesting generators in Python) without needing to cache any intermediate dataset in full. Is the coroutine concept more general than nested generators?

Cesiumfrog (talk) 02:33, 5 September 2019 (UTC)

 * I had the same confusion. But I've added section Definition and Types lately. You may take a look. Thanks. Gqqnb (talk) 12:37, 28 January 2023 (UTC)

Coroutines vs Threads in hard realtime contexts
The Comparison with threads section contains

 * The advantages of coroutines over threads are that they may be used in a hard-realtime context (switching between coroutines need not involve any system calls or any blocking calls whatsoever), there is no need for synchronisation primitives such as mutexes, semaphores, etc. in order to guard critical sections, and there is no need for support from the operating system.

I'm not sure what would be the best way to fix it, but I don't think this is correct. Hard realtime just means that missing the deadline is an error, i.e. never occurs if the software is correct, as opposed to only degrading performance or quality in some way. Some systems have synchronisation primitives, including mutexes, with operations that can be guaranteed to complete in a bounded amount of time, which means they can be used with no risk of missing a deadline. --119.18.1.113 (talk) 03:25, 27 August 2020 (UTC)

 * Good points. An issue I see is that the section seems to imply that threads cannot (at all) be used in hard-realtime contexts, and that coroutines are the (only?) way to go. Maybe it could be rewritten so that coroutines are portrayed as one way of switching context (with little OS support) these systems. Chrisma0 (talk) 08:55, 27 August 2020 (UTC)

Lost History?
In reading this article on coroutines, it appears to me that this term does not mean what it did 50 years ago. I would like to direct everyone's attention to an article called Moving FORTH by Brad Rodriguez. If you look at the section called Indirect Threaded Code you will see three short routines called NEXT, ENTER and EXIT which are truly coroutines. They do not call each other they simply jump to each other based on the code being handled. While the code is executing a function these three coroutines bounce back and forth between the three of them. When the DUP code is called a different coroutine is executed in place of ENTER, and when it completes it jumps back to NEXT without invoking EXIT. If a data element is called, the coroutine for that data element's type is called in place of ENTER. In this way they allow the Virtual Machine they are in to operate efficiently. There are NO subroutine calls involved. The return stack never gets an address to return to one of these routines. There is a return stack being used, but it is associated with the position in the bytecode routine being scanned. I believe that these coroutines exemplify the meaning of what it means to be a coroutine.

If you go back and investigate who was on the team that wrote the COBOL compiler with Melvin Conway (who authored the referenced article [2] which gave coroutines their name) you will probably find Chuck Moore the author of FORTH whose work inspired the Moving FORTH article. 50.206.176.154 (talk) 01:23, 22 April 2021 (UTC)

Coroutine/generator terminology confusion
There are 2 different 'basic' types of coroutine.

 * Symmetric coroutines. There is only one operator, `yield to`, and this transfers control to another coroutine.
 * Asymmetric coroutines. There are two operators, `resume` and `yield`. `resume` transfers control to another coroutine, and then control is transferred back when it performs a `yield`.

There are two more potential distinctions between types of coroutine.

 * Stackful coroutines. You can use `resume`/`yield`/`yield to` within a function call, and when the coroutine recieves control again it continues from within that function call. Yielded coroutines retain their own call stack.
 * Stackless coroutines. You cannot use `yield` or `yield to` within a function call. Yielded coroutines do not retain their own call stack.

There is another distinction which only applies to asymmetric coroutines.

 * Output-only coroutines. `resume` cannot transfer values into the coroutine, but `yield` can transfer them out.
 * Input-output coroutines. Both `resume` and `yield` can transfer values.

This article confuses these distinctions in some way. In the section comparing 'coroutines' with 'generators', it defines 'coroutine' as referring to symmetric coroutines, and 'generator' as referring to asymmetric ones. It seems to imply that 'coroutines' are more expressive than 'generators', and I would disagree, but that's a subjective matter.

Later on in the article, languages like Lua, Python and JavaScript are considered to have 'coroutines'. Both of these languages actually have asymmetric, input-output coroutines, which this article considers 'generators'. These ought to be mentioned in the Generator article, but they're not, they're here.

Python's section in the article implies that the 'generator'/'coroutine' distinction is one of output-only/input-output, rather than symmetric/asymmetric as was defined earlier. This seems to be how the Python community defines the distinction, but this discrepancy should be mentioned.

Overall, this article is very inconsistent and conflates several different flavours of coroutine with each other. This was inevitable as the terminology is completely inconsistent in general usage, and seems to vary between languages. However, both this article and the Generator article should inform about these inconsistencies, rather than feeding into them. Rdococ1 (talk) 18:37, 4 February 2022 (UTC)

 * I agree. The academia doesn't have a common definition of coroutine, which leads to the loose logic of this article. What's more, people also have divided views of whether the coroutine in a language, eg. Python, is stackful or stackless. Gqqnb (talk) 04:24, 31 October 2022 (UTC)

title: Talk:Coroutine


text:
User talk:Brendandonhue

— Ilγαηερ   (Tαlκ)  05:27, 12 Aug 2004 (UTC)

title: User talk:Brendandonhue


text:
Talk:Anti-Japanese sentiment

External links modified
Hello fellow Wikipedians,

I have just modified 4 external links on Anti-Japanese sentiment. Please take a moment to review my edit. If you have any questions, or need the bot to ignore the links, or the page altogether, please visit this simple FaQ for additional information. I made the following changes:
 * Corrected formatting/usage for http://www.worldpublicopinion.org/pipa/articles/views_on_countriesregions_bt/168.php
 * Added tag to http://www.globescan.com/images/images/pressreleases/bbc2014_country_ratings/2013_country_rating_poll_bbc_globescan.pdf
 * Added archive https://web.archive.org/web/20071005042050/http://www.worldpublicopinion.org/pipa/pdf/mar07/BBC_ViewsCountries_Mar07_pr.pdf to http://www.worldpublicopinion.org/pipa/pdf/mar07/BBC_ViewsCountries_Mar07_pr.pdf
 * Added archive https://archive.is/20061113081334/http://www.mosnews.com/news/2005/04/01/japanesedied.shtml to http://www.mosnews.com/news/2005/04/01/japanesedied.shtml
 * Added archive https://web.archive.org/web/20050326094407/http://www.ailf.org/ipc/policy_reports_2004_eatingbitterness.asp to http://www.ailf.org/ipc/policy_reports_2004_eatingbitterness.asp

When you have finished reviewing my changes, you may follow the instructions on the template below to fix any issues with the URLs.

Cheers.— InternetArchiveBot  (Report bug) 07:16, 7 July 2017 (UTC)

External links modified
Hello fellow Wikipedians,

I have just modified one external link on Anti-Japanese sentiment. Please take a moment to review my edit. If you have any questions, or need the bot to ignore the links, or the page altogether, please visit this simple FaQ for additional information. I made the following changes:
 * Added archive https://web.archive.org/web/20120329035815/http://www.worldpublicopinion.org/pipa/pdf/feb06/ViewsCountries_Feb06_quaire.pdf to http://www.worldpublicopinion.org/pipa/pdf/feb06/ViewsCountries_Feb06_quaire.pdf

When you have finished reviewing my changes, you may follow the instructions on the template below to fix any issues with the URLs.

Cheers.— InternetArchiveBot  (Report bug) 23:26, 8 September 2017 (UTC)

Russian
I just checked the claimed Russian derogatory term, and it simply doesn't exist or is not related to Japan at all. It's not in Wiktionary or any dictionary. I even checked the native names provided and it's just a circular reference to this Wikipedia article. Fortunatestars (talk) 06:30, 26 May 2018 (UTC)

title: Talk:Anti-Japanese sentiment


text:
MXML

MXML is an XML-based user interface markup language first introduced by Macromedia in March 2004. Application developers use MXML in combination with ActionScript to develop rich web applications, with products such as Apache Flex.

Adobe Systems, which acquired Macromedia in December 2005, gives no official meaning for the acronym MXML. Some developers suggest it should stand for "Magic eXtensible Markup Language" (which is a backronym). It is likely that the name comes from the MX suffix given to Macromedia Studio products released in 2002 and 2004, or simply "Macromedia eXtensible Markup Language".

MXML is used mainly to declaratively lay out the interface of applications and can also be used to implement business logic and internet application behaviors. It can contain chunks of ActionScript code, either when creating the body of an event handler function, or with data binding where the curly braces ({) syntax is used.

MXML is often used with Flex Server, which dynamically compiles it into standard binary SWF files. However, the Adobe Flash Builder IDE (formerly Adobe Flex Builder) and free Flex SDK can also compile MXML into SWF files without the use of a Flex Server.

There is also a PHP PEAR package called XML_MXML, which is a framework to build Adobe Flex applications.

MXML is considered a proprietary standard due to its tight integration with Adobe technologies. It is like XAML in this respect. No published translators exist for converting an MXML document to another user interface language such as UIML, XUL, XForms, XAML, or SVG. However, there do exist third party vendor plugins for Flex Builder that are capable of generating a result other than a SWF file from Flex applications, for instance native mobile applications.

Example source code
A Hello World example:

title: MXML


text:
Weather report

Weather report may refer to:
 * Weather forecasting, the application of science and technology to predict the weather
 * Weather Report, an American jazz fusion musical group and two namesake studio albums:
 * Weather Report (1971 album)
 * Weather Report (1982 album)
 * Weather Report, a 2003 album by Chris Watson
 * "Weather Report", a song by Scandal from the 2013 album Standard
 * "Weather Report", a speaking recording by Raffi from his 1995 album Raffi Radio
 * Weather Report, a fictional character from JoJo's Bizarre Adventure: Stone Ocean

title: Weather report


text:
Austin St. John

Jason Lawrence Geiger (born September 17, 1974) professionally known as Austin St. John, is an American actor best known for his portrayal of Jason Lee Scott in the Power Rangers franchise.

Early life
Austin St. John is the son of U.S. Marine and martial artist Steve John and his wife, Sharon. He has one sibling, a brother named Stephen. With a parent in the armed forces, St. John lived all over the United States while growing up.

Career
Austin St. John's first acting role and most well-known role to date came to him when he was 19 years old, when he was cast as teen superhero Jason Lee Scott, the Red Power Ranger in Mighty Morphin Power Rangers, the first installment of the Power Rangers franchise, which debuted on Fox Kids in 1993. For his role, he took the stage name Austin St. John, Austin coming from The Six Million Dollar Man's Steve Austin and St. John being a name of his own choosing.

Like St. John, his character had a background in martial arts. Though the series was hugely successful and brought St. John international recognition as an actor, long hours on set combined with low pay and no union recognition presented real challenges for him. As a result, St. John, along with all of his other co-stars including Jason David Frank agreed to leave the show during its second season if their employers rejected their pay demands and unionization attempts, but when time came, only Walter Emanuel Jones and Thuy Trang joined him in the ultimatum and ultimately left the show. St. John was replaced by Steve Cardenas as the Red Ranger.

St. John went on to reprise the role of Jason several times over, in both film and television, including a permanent role in Power Rangers Zeo, and making an appearance as the character in 2002, in an episode of Power Rangers Wild Force entitled "Forever Red". He also appeared alongside Jones, as himself, in the Power Rangers special The Lost Episode in 1999, which focused on the history of the franchise up to that point and showed the original pilot episode for the series, which had never before been aired. In 2017, he made a cameo in the movie Surge of Power: Revenge of the Sequel. In 2018, he was acting in the television movie Monsters At Large and had a major role in the 2019 dramatic movie A Walk with Grace.

In 2020, St. John reprised the role of Jason in a second season episode of Power Rangers Beast Morphers titled "Grid Connection".

In 2022, he had the lead role in the film Tres Leches, directed by John Schneider. The film is available for free on Schneider's official YouTube channel.

Other ventures
Austin St. John began as a proficient martial artist, holding a second-degree black belt in Taekwondo, a first-degree black belt in Judo and a first-degree black belt in Kenpo and for a time, he worked as a martial arts instructor. Additionally, he published a book on the subject, Karate Warrior: A Beginner's Guide to Martial Arts, in 1996.

In February 2024, he announced plans to start a controversial clothing line featuring quotes from prominent historical figures — including Adolf Hitler. Drawing fierce condemnation from fans, as well as Amy Jo Johnson, who costarred in the series as Kimberly Hart, the Pink Ranger. As of publication, there is yet to be any appearance of this clothing line on St. John's website.

Personal life
Austin St. John attended Robert Frost Middle School and W.T. Woodson High School in Fairfax, VA, before moving to Fullerton, California, where he attended Sunny Hills High School, but did not graduate. As an adult, he went on to earn his G.E.D. and ultimately obtained his undergraduate degree from Concordia University.

CARES Act indictment
In May 2022, St. John was indicted on federal criminal charges related to the CARES Act. He allegedly conspired in a $3.5 million scheme to create businesses or use an existing business to submit applications to fraudulently obtain Paycheck Protection Program funding. Prosecutors said participants in the conspiracy would file false supporting documentation and misrepresent key details, including the number of their employees and the amount of their payroll, causing the Small Business Administration and financial institutions to issue loans. Prosecutors allege St. John and co-defendants paid the ringleaders of the scheme, and spent the money on personal purchases. If convicted, he could face up to 20 years in prison.

Since the indictment, St. John agreed to be put on pre-trial release. He is only allowed to leave the state of Texas for work, with the permission of the court. This includes his previously scheduled convention appearances. On May 25, 2022, St. John released a video confirming these recent events as true and reiterated his legal inability to discuss said events at his entertainment-based public appearances. St. John pled guilty to the charges on April 22, 2024 as part of a plea agreement, the notice of which was published on May 1.

title: Austin St. John


text: User talk:82.208.179.70

title: User talk:82.208.179.70


text:
Quintus Tullius Cicero

Quintus Tullius Cicero (, ; 102 BC – 43 BC) was a Roman statesman and military leader, as well as the younger brother of Marcus Tullius Cicero. He was born into a family of the equestrian order, as the son of a wealthy landowner in Arpinum, some 100 km south-east of Rome. He is known for his political career, governorship of Asia, time serving as a general in Gaul under Caesar, and for his relationship with Cicero.

Biography
Cicero's well-to-do father arranged for him to be educated with his brother in Rome, Athens and probably Rhodes in 79–77 BC. Around 70 BC, he married Pomponia (sister of his brother's friend Atticus), a dominant woman of strong personality. He divorced her after a long disharmonious marriage with much bickering between the spouses in late 45 BC. His brother, Marcus, tried several times to reconcile the spouses, but to no avail. The couple had a son born in 66 BC and named Quintus Tullius Cicero after his father.

Quintus was aedile in 66 BC, praetor in 62 BC, and propraetor of the province of Asia for three years (61-59 BC.) Under Caesar, during the Gallic Wars, he was legatus (accompanying Caesar on his second expedition to Britain in 54 BC and surviving a Nervian siege of his camp during Ambiorix's revolt), and was under his brother when the latter was governor in Cilicia in 51 BC. During Caesar's civil war, he supported the Pompeian faction, obtaining the pardon of Caesar later.

During the Second Triumvirate, when the Roman Republic was again in civil war, Quintus, his son, and his brother were all proscribed. He fled from Tusculum with his brother. Later, Quintus went home to bring back money for travelling expenses. His son hid his father and did not reveal the hiding place even under torture. When Quintus heard this, he gave himself up to try to save his son, but father, son, and famous brother, were killed in 43 BC as proscribed persons.

Personality and relationship with brother Marcus
Quintus is depicted by Caesar as a brave soldier and an inspiring military leader. At a critical moment in the Gallic Wars, he rallied his legion and retrieved an apparently hopeless position. Caesar commended him for this with the words "He praised Cicero and his men very highly, as they deserved". However, later the legate was purportedly responsible for a near-disaster in Gaul but does not receive condemnation from Caesar as a result.

Quintus had an impulsive temperament and had fits of cruelty during military operations, a behaviour frowned on by Romans of that time. The Roman (and stoic) ideal was to control one's emotions even in battle. Quintus Cicero also liked old-fashioned and harsh punishments, like putting a person convicted of patricide into a sack and throwing him into the sea. Such convicts were traditionally "stripped, scourged, sewn up in a sack together with [a] dog, a cock, a viper, and a monkey, and thrown into a river or the sea to drown". This punishment he meted out during his propraetorship of Asia.

His brother confessed in one of his letters to his friend Titus Pomponius Atticus (written in 51 BC while he was Proconsul of Cilicia and had taken Quintus as legatus with him) that he dares not leave Quintus alone as he is afraid of what kind of sudden ideas he might have. On the positive side, Quintus was utterly honest, even as a governor of a province, in which situation many Romans shamelessly amassed private property for themselves. He was also a well-educated man who enjoyed reading Greek tragedies, and even wrote some tragedies himself.

The relationship between the brothers was mostly affectionate, except for a period of serious disagreement during Caesar's dictatorship 49-44 BC. The many letters from Marcus ad Quintum fratrem show how deep and affectionate the brothers' relationship was, though Marcus Cicero often played the role of the "older and more experienced" sibling, lecturing to his brother on what the right thing to do was.

Authorship
As an author during the Gallic wars, he wrote four tragedies in the Greek style. Three of them were titled Troas, Erigones, and Electra, but all are lost. He also wrote several poems on the second expedition of Caesar to Britannia, three epistles to Tiro (extant) and a fourth one to his brother. The long letter Commentariolum Petitionis (Handbook on electioneering) has also survived. Although its authenticity has been much questioned, recently the scholar Andrew Lintott has argued that Quintus was the true author. It is in any case a guide to political behavior in Cicero's time.

title: Quintus Tullius Cicero


text:
Productivity (linguistics)

In linguistics, productivity is the degree to which speakers of a language use a particular grammatical process, especially in word formation. It compares grammatical processes that are in frequent use to less frequently used ones that tend towards lexicalization. Generally the test of productivity concerns identifying which grammatical forms would be used in the coining of new words: these will tend to only be converted to other forms using productive processes.

Examples in English
In standard English, the formation of preterite and past participle forms of verbs by means of ablaut (as Germanic strong verbs, for example, sing–sang–sung) is no longer considered productive. Newly coined verbs in English overwhelmingly use the 'weak' (regular) ending -ed for the past tense and past participle (for example, spammed, e-mailed). Similarly, the only clearly productive plural ending is -(e)s; it is found on the vast majority of English count nouns and is used to form the plurals of neologisms, such as FAQs and Muggles. The ending -en, on the other hand, is no longer productive, being found only in oxen, children, and the now-rare brethren (as a plural of brother). Because these old forms can sound incorrect to modern ears, regularization can wear away at them until they are no longer used: brethren has now been replaced with the more regular-sounding brothers except when talking about religious orders. It appears that many strong verbs were completely lost during the transition from Old English to Middle English, possibly because they sounded archaic or were simply no longer truly understood.

In both cases, however, occasional exceptions have occurred. A false analogy with other verbs caused dug to become thought of as the 'correct' preterite and past participle form of dig (the King James Bible preferred digged in 1611) and more recent examples, like snuck from sneak and dove from dive, have similarly become popular. Some American English dialects also use the non-standard drug as the past tense of drag.

Significance
Since use to produce novel (new, non-established) structures is the clearest proof of usage of a grammatical process, the evidence most often appealed to as establishing productivity is the appearance of novel forms of the type the process leads one to expect, and many people would limit the definition offered above to exclude use of a grammatical process that does not result in a novel structure. Thus in practice, and, for many, in theory, productivity is the degree to which speakers use a particular grammatical process for the formation of novel structures. A productive grammatical process defines an open class, one which admits new words or forms. Non-productive grammatical processes may be seen as operative within closed classes: they remain within the language and may include very common words, but are not added to and may be lost in time or through regularization converting them into what now seems to be a correct form.

Productivity is, as stated above and implied in the examples already discussed, a matter of degree, and there are a number of areas in which that may be shown to be true. As the modern example of snuck from sneak shows, what has apparently been non-productive for many decades or even centuries may suddenly come to some degree of productive life, and it may do so in certain dialects or sociolects while not in others, or in certain parts of the vocabulary but not others. Some patterns are only very rarely productive, others may be used by a typical speaker several times a year or month, whereas others (especially syntactic processes) may be used productively dozens or hundreds of times in a typical day. It is not atypical for more than one pattern with similar functions to be comparably productive, to the point that a speaker can be in a quandary as to which form to use —e.g., would it be better to say that a taste or color like that of raisins is raisinish, raisiny, raisinlike, or even raisinly?

It can also be very difficult to assess when a given usage is productive or when a person is using a form that has already been learned as a whole. Suppose a reader comes across an unknown word such as despisement meaning "an attitude of despising". The reader may apply the verb+ment noun-formational process to understand the word perfectly well, and this would be a kind of productive use. This would be essentially independent of whether or not the writer had also used the same process productively in coining the term, or whether he or she had learned the form from previous usage (as most English speakers have learned government, for instance), and no longer needed to apply the process productively in order to use the word. Similarly a speaker or writer's use of words like raisinish or raisiny may or may not involve productive application of the noun+ish and noun+y rules, and the same is true of a hearer or reader's understanding of them. But it will not necessarily be at all clear to an outside observer, or even to the speaker and hearer themselves, whether the form was already learnt and whether the rules were applied or not.

Examples in other languages
One study, which focuses on the usage of the Dutch suffix -heid (comparable to -ness in English) hypothesizes that -heid gives rise to two kinds of abstract nouns: those referring to concepts and those referring to states of affairs. It shows that the referential function of -heid is typical for the lowest-frequency words, while its conceptual function is typical for the highest-frequency words. It claims that high-frequency formations with the suffix -heid are available in the mental lexicon, whereas low-frequency words and neologisms are produced and understood by rule.

title: Productivity (linguistics)