1.內(nèi)部使用 C 的 longjmp 機(jī)制讓出一個(gè)協(xié)程。?因此,如果一個(gè) C 函數(shù) foo 調(diào)用了一個(gè) API 函數(shù), 而這個(gè) API 函數(shù)讓出了(直接或間接調(diào)用了讓出函數(shù))。 由于 longjmp 會(huì)移除 C 棧的棧幀, Lua 就無(wú)法返回到 foo 里了。
2.為了回避這類問(wèn)題, 碰到 API 調(diào)用中調(diào)用讓出時(shí),除了那些拋出錯(cuò)誤的 API 外,還提供了三個(gè)函數(shù): lua_yieldk, lua_callk,和 lua_pcallk 。 它們?cè)谧尦霭l(fā)生時(shí),可以從傳入的 延續(xù)函數(shù) (名為 k 的參數(shù))繼續(xù)運(yùn)行。
3.我們需要預(yù)設(shè)一些術(shù)語(yǔ)來(lái)解釋延續(xù)點(diǎn)。?對(duì)于從 Lua 中調(diào)用的 C 函數(shù),我們稱之為 原函數(shù)。?從這個(gè)原函數(shù)中調(diào)用的上面所述的三個(gè) C API 函數(shù)我們稱之為 被調(diào)函數(shù)。 被調(diào)函數(shù)可以使當(dāng)前線程讓出。 (讓出發(fā)生在被調(diào)函數(shù)是 lua_yieldk, 或傳入 lua_callk 或 lua_pcallk 的函數(shù)調(diào)用了讓出時(shí)。)
4.假設(shè)正在運(yùn)行的線程在執(zhí)行被調(diào)函數(shù)時(shí)讓出。?當(dāng)再次延續(xù)這條線程,它希望繼續(xù)被調(diào)函數(shù)的運(yùn)行。 然而,被調(diào)函數(shù)不可能返回到原函數(shù)中。 這是因?yàn)橹暗淖尦霾僮髌茐牧?C 棧的棧幀。 作為替代品,Lua 調(diào)用那個(gè)作為被調(diào)函數(shù)參數(shù)給出的 延續(xù)函數(shù) 。 正如其名,延續(xù)函數(shù)將延續(xù)原函數(shù)的任務(wù)。
5.注意這里那個(gè)額外的顯式的對(duì)延續(xù)函數(shù)的調(diào)用:Lua 僅在需要時(shí),這可能是由錯(cuò)誤導(dǎo)致的也可能是發(fā)生了讓出而需要繼續(xù)運(yùn)行,才會(huì)調(diào)用延續(xù)函數(shù)。 如果沒(méi)有發(fā)生過(guò)任何讓出,調(diào)用的函數(shù)正常返回, 那么 lua_pcallk (以及 lua_callk)也會(huì)正常返回。 (當(dāng)然,這個(gè)例子中你也可以不在之后調(diào)用延續(xù)函數(shù), 而是在原函數(shù)的調(diào)用后直接寫上需要做的工作。)
6.Lua 會(huì)把延續(xù)函數(shù)看作原函數(shù)。?延續(xù)函數(shù)將接收到和原函數(shù)相同的 Lua 棧,其接收到的 lua 狀態(tài)也和 被調(diào)函數(shù)若返回后應(yīng)該有的狀態(tài)一致。 (例如, lua_callk 調(diào)用之后, 棧中之前壓入的函數(shù)和調(diào)用參數(shù)都被調(diào)用產(chǎn)生的返回值所替代。) 這時(shí)也有相同的上值。 等到它返回的時(shí)候,Lua 會(huì)將其看待成原函數(shù)的返回去操作。
7.我們需要預(yù)設(shè)一些術(shù)語(yǔ)來(lái)解釋延續(xù)點(diǎn)。?對(duì)于從 Lua 中調(diào)用的 C 函數(shù),我們稱之為 原函數(shù)。 從這個(gè)原函數(shù)中調(diào)用的上面所述的三個(gè) C API 函數(shù)我們稱之為 被調(diào)函數(shù)。 被調(diào)函數(shù)可以使當(dāng)前線程讓出。 (讓出發(fā)生在被調(diào)函數(shù)是 lua_yieldk, 或傳入 lua_callk 或 lua_pcallk 的函數(shù)調(diào)用了讓出時(shí)。)
8.假設(shè)正在運(yùn)行的線程在執(zhí)行被調(diào)函數(shù)時(shí)讓出。?當(dāng)再次延續(xù)這條線程,它希望繼續(xù)被調(diào)函數(shù)的運(yùn)行。 然而,被調(diào)函數(shù)不可能返回到原函數(shù)中。 這是因?yàn)橹暗淖尦霾僮髌茐牧?C 棧的棧幀。 作為替代品,Lua 調(diào)用那個(gè)作為被調(diào)函數(shù)參數(shù)給出的 延續(xù)函數(shù) 。 正如其名,延續(xù)函數(shù)將延續(xù)原函數(shù)的任務(wù)。
希望能幫到你,謝謝!
會(huì)的,為什么?
2013 年,美國(guó)在線編程教育網(wǎng)站 code.org 發(fā)起“編程一小時(shí)”活動(dòng),時(shí)任美國(guó)總統(tǒng)奧巴馬不僅拍攝了一段宣傳片支持,并且親身上陣寫了一段 Java 代碼,這也讓他成為美國(guó)史上*位會(huì)寫代碼的總統(tǒng)。奧巴馬之后,美國(guó)科技圈名人比爾蓋茨、扎克伯格等也紛紛發(fā)言,號(hào)召編程要從娃娃抓起。
現(xiàn)在已2021年,國(guó)內(nèi)少兒編程已經(jīng)得到一二線城市大多數(shù)家長(zhǎng)的認(rèn)可,在個(gè)別地區(qū)政策上也得到了支持,編程開(kāi)始走進(jìn)*課堂。
您好,我們是國(guó)內(nèi)技術(shù)領(lǐng)先的兒童編程教育軟/硬件提供商,**人工智能學(xué)會(huì)合作教育企業(yè)。
關(guān)于課程質(zhì)量、師資力量等可以進(jìn)入我們官網(wǎng)詳細(xì)查看,教學(xué)方面可以讓孩子學(xué)習(xí)免費(fèi)的體驗(yàn)課程,來(lái)切身體會(huì)。
希望可以幫助到您。
童程童美通過(guò)趣味編程教育培養(yǎng)興趣;同時(shí)發(fā)現(xiàn)在編程領(lǐng)域有天賦的孩子,提供成為下一個(gè)IT精英的職業(yè)編程教育。少兒編程需要什么軟件分享:
1.Scratch(麻省理工)
Scratch是麻省理工為孩子開(kāi)發(fā)的一種0元編程語(yǔ)言,這是一種0元語(yǔ)言,輔以入門課程、家長(zhǎng)指導(dǎo)和強(qiáng)大的用戶社區(qū)。
Scratch使用程序積木塊的可視化界面為孩子(和家長(zhǎng))創(chuàng)造更有趣的體驗(yàn)。孩子可以將程序積木塊(如動(dòng)作、事件和運(yùn)算符)堆疊在一起。
每個(gè)程序積木塊的形狀只允許它與兼容對(duì)象相結(jié)合,例如,“重復(fù)循環(huán)”的形狀就像一個(gè)橫向的“U”,讓孩子知道需要在循環(huán)的開(kāi)始和結(jié)束之間放置一個(gè)塊。
Scratch可以用來(lái)制作真實(shí)的動(dòng)畫(huà)和游戲,它有許多圖片和角色,可以自己上傳圖片和角色。如果計(jì)算機(jī)沒(méi)有連接到互聯(lián)網(wǎng),也可以使用Scratch,孩子們可以選擇在Scratch的在線社區(qū)分享自己的作品。
建議年齡:8-16歲
要求:運(yùn)行Mac、Windows或Linux的計(jì)算機(jī)
2.Blockly(谷歌)
Blockly是谷歌對(duì)Scratch的改進(jìn),它借鑒了Scratch的可拖動(dòng)程序積木塊的交互設(shè)計(jì)方法,但它可以用幾種不同的編程語(yǔ)言輸出代碼,如、Python、PHP、Lua和Dart。
Blockly和Scratch的區(qū)別在于,將程序積木塊鏈接在一起時(shí),可以在屏幕的一側(cè)看到代碼,并且可以隨時(shí)切換編程語(yǔ)言來(lái)查看同一程序的語(yǔ)法差異。這使得Blockly成為所有年齡段教學(xué)代碼的理想選擇,包括年齡較大的孩子和成人。
如果這聽(tīng)起來(lái)像是Scratch的驚人轉(zhuǎn)變,谷歌實(shí)際上是在與麻省理工合作開(kāi)發(fā)基于Blockly平臺(tái)的下一代Scratch。
建議年齡:10歲以上
要求:運(yùn)行Windows,MacOS或Linux的計(jì)算機(jī)
3.Alice
Alice是一個(gè)0元的3D編程工具,旨在教授面向?qū)ο缶幊陶Z(yǔ)言的概念,如C++。它使用熟悉的積木式方法,允許孩子通過(guò)編程相機(jī)運(yùn)動(dòng)、3D模型和場(chǎng)景來(lái)創(chuàng)建游戲或動(dòng)畫(huà)。
Alice是由卡內(nèi)基梅隆*開(kāi)發(fā)的。
建議年齡:10歲以上
要求:運(yùn)行Mac,Windows或Linux的計(jì)算機(jī)
學(xué)編程是很有用的,會(huì)對(duì)孩子的學(xué)習(xí)奠定良好的學(xué)習(xí)基礎(chǔ)。少兒編程課程的目的并不是把孩子培養(yǎng)成一個(gè)程序員,而是以興趣為導(dǎo)向,著重培養(yǎng)孩子的創(chuàng)造力、創(chuàng)新力、想象力和人格健全能力。因此少兒編程教育在當(dāng)前看來(lái)還是很有用的。
學(xué)習(xí)少兒編程的好處:
1、鍛煉孩子的邏輯思維能力。少兒編程是跨*整合知識(shí)的*途徑,可以讓孩子慢慢學(xué)會(huì)如何取組織和完善自己的想法,把自己的想法努力變成一個(gè)生動(dòng)和完整的作品,以此來(lái)增強(qiáng)孩子的自信心。
2、輔助學(xué)習(xí)。隨著大數(shù)據(jù)技術(shù)的發(fā)展,未來(lái)的學(xué)習(xí)過(guò)程將更加智能化,更多的智能體將以教育的形式走進(jìn)人們的生活,而編程語(yǔ)言是與這些智能體進(jìn)行交流的重要方式之一,所以掌握編程語(yǔ)言對(duì)于學(xué)習(xí)也有重要意義。
3、方便生活。隨著5G的落地應(yīng)用,未來(lái)在生活場(chǎng)景中會(huì)有越來(lái)越多可編程的智能體,掌握編程技術(shù)可以更加方便的按照自己的需求進(jìn)行各種個(gè)性化的設(shè)定。【學(xué)少兒編程可以提高孩子邏輯思維、專注力!】
如果對(duì)少兒編程感興趣,推薦咨童程童美。童程童美,成立于2015年,經(jīng)過(guò)6年的發(fā)展,打造出適合*孩子編程教育的解決方案,形成以人工智能編程、智能機(jī)器人編程、信息學(xué)奧賽編程等課程為核心的課程體系。230+學(xué)習(xí)中心,覆蓋*50+城市, 2000+真人講師。【童程童美少兒編程體驗(yàn)課,點(diǎn)擊可免費(fèi)報(bào)名試聽(tīng)】
只要一個(gè)電話
我們免費(fèi)為您回電