diff options
| author | muqiuhan <[email protected]> | 2024-05-27 02:37:20 +0000 |
|---|---|---|
| committer | muqiuhan <[email protected]> | 2024-05-27 02:37:20 +0000 |
| commit | d47994217a2df8d80a244e8fcbad980bbcfd00c7 (patch) | |
| tree | 7e171f48e1e288c209d639bb050e8331d474ab83 /search.xml | |
| parent | 39ce803724040af020a6e63ab9c4d54ab0b67162 (diff) | |
| download | blog-d47994217a2df8d80a244e8fcbad980bbcfd00c7.tar.gz | |
deploy: 74dc3d892d8e10bfddfa931b1cae8bdc462132a0
Diffstat (limited to 'search.xml')
| -rw-r--r-- | search.xml | 119 |
1 files changed, 61 insertions, 58 deletions
@@ -668,6 +668,38 @@ </tags> </entry> <entry> + <title>过度疲劳的六种表现</title> + <url>/2023/10/12/%E8%BF%87%E5%BA%A6%E7%96%B2%E5%8A%B3%E7%9A%84%E5%85%AD%E7%A7%8D%E8%A1%A8%E7%8E%B0/</url> + <content><![CDATA[<ol> +<li>不知不觉就睡着了, 比如在地铁, 公交车这一类很吵闹的地方无意识睡着了。</li> +<li>刚起床就感觉很累,怎么睡都睡不够,醒来就很累,很疲惫,身心俱疲的无力感</li> +<li>长溃疡,结节甚至是囊肿,免疫力下降,反复溃疡,年纪轻轻身上一堆结节和囊肿</li> +<li>比较严重的体臭,口臭,头发油臭,和正常的味道不同,肝功能下降,氨随汗液排出,这种“疲劳臭”很难闻。</li> +<li>脱发长痘痘,痘痘反复发作,年纪轻轻头发大把大把掉,梳头一地头发。</li> +<li>对任何事物都感到厌烦,对任何事物都提不起兴趣,第一反应是很烦,做什么都烦</li> +</ol> +<p>身体不舒服应该第一时间去医院,如果你打算明天去医院看看的话,那今天就不要剧烈运动了,也不要再过度劳累,好今晚好好泡一个热水澡早点睡觉噢。</p> +]]></content> + <tags> + <tag>Life</tag> + </tags> + </entry> + <entry> + <title>隐藏一些OCaml Effect的机制,让其语法在精神上更接近delimcc</title> + <url>/2023/06/28/%E9%9A%90%E8%97%8F%E4%B8%80%E4%BA%9BOCaml-Effect%E7%9A%84%E6%9C%BA%E5%88%B6%EF%BC%8C%E8%AE%A9%E5%85%B6%E8%AF%AD%E6%B3%95%E5%9C%A8%E7%B2%BE%E7%A5%9E%E4%B8%8A%E6%9B%B4%E6%8E%A5%E8%BF%91delimcc/</url> + <content><![CDATA[<p><a href="https://github.com/kayceesrk/delimcc_of_fxhandler">delimcc_of_fxhandler这个库</a>在OCaml5的effect handlers上实现了一些delimcc原语(shift/reset, control/prompt这些):</p> +<figure class="highlight ocaml"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> p = new_prompt <span class="literal">()</span> <span class="keyword">in</span></span><br><span class="line"><span class="keyword">assert</span> (<span class="literal">[]</span> = push_prompt p (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> <span class="number">1</span>::<span class="number">2</span>::take_subcont p (<span class="keyword">fun</span> _k -> <span class="literal">[]</span>)));</span><br><span class="line"><span class="keyword">assert</span> ([<span class="number">1</span>;<span class="number">2</span>] = push_prompt p (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> <span class="number">1</span>::<span class="number">2</span>::take_subcont p (<span class="keyword">fun</span> k -> push_subcont k <span class="literal">[]</span>)));</span><br><span class="line"><span class="keyword">assert</span> (<span class="number">135</span> =</span><br><span class="line"> <span class="keyword">let</span> p1 = new_prompt <span class="literal">()</span> <span class="keyword">in</span></span><br><span class="line"> <span class="keyword">let</span> p2 = new_prompt <span class="literal">()</span> <span class="keyword">in</span></span><br><span class="line"> <span class="keyword">let</span> p3 = new_prompt <span class="literal">()</span> <span class="keyword">in</span></span><br><span class="line"> <span class="keyword">let</span> pushtwice sk =</span><br><span class="line"> sk (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> sk (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> shift0 p2 (<span class="keyword">fun</span> sk2 -> sk2 (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> sk2 (<span class="keyword">fun</span> <span class="literal">()</span> -> <span class="number">3</span>))) <span class="literal">()</span>))</span><br><span class="line"> <span class="keyword">in</span></span><br><span class="line"> push_prompt p1 (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> push_prompt p2 (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> push_prompt p3 (<span class="keyword">fun</span> <span class="literal">()</span> -> shift0 p1 pushtwice <span class="literal">()</span>) + <span class="number">10</span>) + <span class="number">1</span>) + <span class="number">100</span>);</span><br><span class="line"></span><br><span class="line">print_endline <span class="string">"Success!"</span></span><br></pre></td></tr></table></figure> + +<p>另外, <a href="https://github.com/avsm/ocaml/commits/effect-syntax">avsm这里</a>可以看到一些OCaml的Effect Syntax进展。</p> +<p>还有 <a href="https://github.com/dhil/ocaml-multicont">multi-shot continuations in OCaml</a>,在这个仓库里面还讨论了一些有趣的问题,例如,OCaml 编译器和runtime会做出一些假设从而进行一些优化,这些优化在使用multi-shot continutation时是不可取的(或完全错误的)。编译器优化导致错误的一个例子是堆到栈的转换,例如:</p> +<figure class="highlight ocaml"><table><tr><td class="code"><pre><span class="line"><span class="comment">(* An illustration of how the heap to stack optimisation is broken.</span></span><br><span class="line"><span class="comment"> * This example is adapted from de Vilhena and Pottier (2021).</span></span><br><span class="line"><span class="comment"> * file: heap2stack.ml</span></span><br><span class="line"><span class="comment"> * compile: ocamlopt -I $(opam var lib)/multicont multicont.cmxa heap2stack.ml</span></span><br><span class="line"><span class="comment"> * run: ./a.out *)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">(* We first require a little bit of setup. The following declares an</span></span><br><span class="line"><span class="comment"> operation `Twice' which we use to implement multiple returns. *)</span></span><br><span class="line"><span class="keyword">type</span> _ <span class="type">Effect</span>.t += <span class="type">Twice</span> : <span class="built_in">unit</span> <span class="type">Effect</span>.t</span><br><span class="line"></span><br><span class="line"><span class="comment">(* The handler `htwice' interprets `Twice' by simply invoking its</span></span><br><span class="line"><span class="comment"> continuation twice. *)</span></span><br><span class="line"><span class="keyword">let</span> htwice : (<span class="built_in">unit</span>, <span class="built_in">unit</span>) <span class="type">Effect</span>.<span class="type">Deep</span>.handler</span><br><span class="line"> = { retc = (<span class="keyword">fun</span> x -> x)</span><br><span class="line"> ; exnc = (<span class="keyword">fun</span> e -> raise e)</span><br><span class="line"> ; effc = (<span class="keyword">fun</span> (<span class="keyword">type</span> a) (eff : a <span class="type">Effect</span>.t) -></span><br><span class="line"> <span class="keyword">let</span> <span class="keyword">open</span> <span class="type">Effect</span>.<span class="type">Deep</span> <span class="keyword">in</span></span><br><span class="line"> <span class="keyword">match</span> eff <span class="keyword">with</span></span><br><span class="line"> | <span class="type">Twice</span> -> <span class="type">Some</span> (<span class="keyword">fun</span> (k : (a, _) continuation) -></span><br><span class="line"> continue (<span class="type">Multicont</span>.<span class="type">Deep</span>.clone_continuation k) <span class="literal">()</span>;</span><br><span class="line"> continue k <span class="literal">()</span>)</span><br><span class="line"> | _ -> <span class="type">None</span>) }</span><br><span class="line"></span><br><span class="line"><span class="comment">(* Now for the interesting stuff. In the code below, the compiler will</span></span><br><span class="line"><span class="comment"> perform an escape analysis on the reference `i' and deduce that it</span></span><br><span class="line"><span class="comment"> does not escape the local scope, because it is unaware of the</span></span><br><span class="line"><span class="comment"> semantics of `perform Twice', hence the optimiser will transform</span></span><br><span class="line"><span class="comment"> `i' into an immediate on the stack to save a heap allocation. As a</span></span><br><span class="line"><span class="comment"> consequence, the assertion `(!i = 1)' will succeed twice, whereas</span></span><br><span class="line"><span class="comment"> it should fail after the second return of `perform Twice'. *)</span></span><br><span class="line"><span class="keyword">let</span> heap2stack <span class="literal">()</span> =</span><br><span class="line"> <span class="type">Effect</span>.<span class="type">Deep</span>.match_with</span><br><span class="line"> (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> <span class="keyword">let</span> i = <span class="built_in">ref</span> <span class="number">0</span> <span class="keyword">in</span></span><br><span class="line"> <span class="type">Effect</span>.perform <span class="type">Twice</span>;</span><br><span class="line"> i := !i + <span class="number">1</span>;</span><br><span class="line"> <span class="type">Printf</span>.printf <span class="string">"i = %d\n%!"</span> !i;</span><br><span class="line"> <span class="keyword">assert</span> (!i = <span class="number">1</span>))</span><br><span class="line"> <span class="literal">()</span> htwice</span><br><span class="line"></span><br><span class="line"><span class="comment">(* The following does not trigger an assertion failure. *)</span></span><br><span class="line"><span class="keyword">let</span> _ = heap2stack <span class="literal">()</span></span><br><span class="line"></span><br><span class="line"><span class="comment">(* To fix this issue, we can wrap reference allocations in an instance</span></span><br><span class="line"><span class="comment"> of `Sys.opaque_identity'. However, this is not really a viable fix</span></span><br><span class="line"><span class="comment"> in general, as we may not have access to the client code that</span></span><br><span class="line"><span class="comment"> allocates the reference! *)</span></span><br><span class="line"><span class="keyword">let</span> heap2stack' <span class="literal">()</span> =</span><br><span class="line"> <span class="type">Effect</span>.<span class="type">Deep</span>.match_with</span><br><span class="line"> (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> <span class="keyword">let</span> i = <span class="type">Sys</span>.opaque_identity (<span class="built_in">ref</span> <span class="number">0</span>) <span class="keyword">in</span></span><br><span class="line"> <span class="type">Effect</span>.perform <span class="type">Twice</span>;</span><br><span class="line"> i := !i + <span class="number">1</span>;</span><br><span class="line"> <span class="type">Printf</span>.printf <span class="string">"i = %d\n%!"</span> !i;</span><br><span class="line"> <span class="keyword">assert</span> (!i = <span class="number">1</span>))</span><br><span class="line"> <span class="literal">()</span> htwice</span><br><span class="line"></span><br><span class="line"><span class="comment">(* The following triggers an assertion failure. *)</span></span><br><span class="line"><span class="keyword">let</span> _ = heap2stack' <span class="literal">()</span></span><br></pre></td></tr></table></figure> +]]></content> + <tags> + <tag>Technique</tag> + <tag>OCaml</tag> + </tags> + </entry> + <entry> <title>WiscKey: Separating Keys from Values in SSD-conscious Storage</title> <url>/2023/07/21/WiscKey-Separating-Keys-from-Values-in-SSD-conscious-Storage/</url> <content><![CDATA[<p>We present WiscKey, a persistent LSM-tree-based key-value store with a performance-oriented data layoutthat separates keys from values to minimize I/O amplifi-cation. The design of WiscKey is highly SSD optimized, leveraging both the sequential and random performance characteristics of the device.</p> @@ -959,6 +991,20 @@ </categories> </entry> <entry> + <title>二〇二四年三月二十二日</title> + <url>/2024/03/22/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B8%89%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/</url> + <content><![CDATA[<p>毛毛在人群中牵着我,却很难融入人群,我在林中面对着毛毛,树木的思想却千姿百态地向我涌来。<br>它说,它要将灵魂撕裂,让它暴露在最灼热的阳光下灼烧,要让风刺进来,硬生生扯开一道口子,要让原有的赤色消失殆尽,只留下一堆松散的灰色颗粒,任雨打浮萍。</p> +<p>毛毛和我看到了宇宙熵增,和我见到了熙攘的街道,现在变成了我耳边的风声。<br>是啊,是啊,你不再身陷囹圄,自由不再是攀在高墙上爬山虎的叶子,不再是吹进风间的花粉,不再是藏躲进阴暗土地里的水,不再是破碎割手的杯子片块。<br>但是这个世界还是越来越美了,我独自一人,却很自在,别无所求,只想被阳光晒透,被狂风穿过。渴望成熟,要准备好死去,也准备好重生。</p> +<hr> +<p>小土堆上长出了狗尾巴草,当我靠近时,狗尾巴草会向我轻轻晃动,就像它小时候向我跑来时那样,不同的是,当我向前跑的时候,背后没有一个小小的身影再追过来了,但当我回望小土堆,狗尾巴草依然在摇晃,就像当初给予我回应那样。</p> +<hr> +<p>狗儿要听狗儿歌,<br>毛毛下雨要回家,<br>小狗小狗画梅花,<br>直走就是我们家。</p> +]]></content> + <categories> + <category>gallery</category> + </categories> + </entry> + <entry> <title>二〇二四年三月十二日</title> <url>/2024/03/12/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B8%89%E6%9C%88%E5%8D%81%E4%BA%8C%E6%97%A5/</url> <content><![CDATA[]]></content> @@ -1256,18 +1302,18 @@ </categories> </entry> <entry> - <title>二零二二年九月二十二日</title> - <url>/2022/09/22/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E4%B9%9D%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/</url> - <content><![CDATA[<p>似是而非的脸,和我的吉他,低头呢喃细语,抬头语焉不详,麦浪,烈日,溪水,咳嗽,敲打,药丸碰撞罐壁。</p> + <title>二零二二年三月十四日</title> + <url>/2022/03/14/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E4%B8%89%E6%9C%88%E5%8D%81%E5%9B%9B%E6%97%A5/</url> + <content><![CDATA[<p>我很庆幸能在那年中秋的傍晚出门走走。我看到了落日藏进天边,看到了圆月晕开情绪,我感受到了小山包上的晚风,感受到了落叶翻进衣领清扫锁骨,它们让我留在这个小地方做个平凡且平庸的人,过着平静且平安的生活,尽管生活平常且饭菜平淡,但这日子的每分每秒都是我对生活的爱意。</p> ]]></content> <categories> <category>gallery</category> </categories> </entry> <entry> - <title>二零二二年三月十四日</title> - <url>/2022/03/14/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E4%B8%89%E6%9C%88%E5%8D%81%E5%9B%9B%E6%97%A5/</url> - <content><![CDATA[<p>我很庆幸能在那年中秋的傍晚出门走走。我看到了落日藏进天边,看到了圆月晕开情绪,我感受到了小山包上的晚风,感受到了落叶翻进衣领清扫锁骨,它们让我留在这个小地方做个平凡且平庸的人,过着平静且平安的生活,尽管生活平常且饭菜平淡,但这日子的每分每秒都是我对生活的爱意。</p> + <title>二零二二年九月二十二日</title> + <url>/2022/09/22/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E4%B9%9D%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/</url> + <content><![CDATA[<p>似是而非的脸,和我的吉他,低头呢喃细语,抬头语焉不详,麦浪,烈日,溪水,咳嗽,敲打,药丸碰撞罐壁。</p> ]]></content> <categories> <category>gallery</category> @@ -1292,20 +1338,6 @@ </categories> </entry> <entry> - <title>二〇二四年三月二十二日</title> - <url>/2024/03/22/%E4%BA%8C%E3%80%87%E4%BA%8C%E5%9B%9B%E5%B9%B4%E4%B8%89%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%8C%E6%97%A5/</url> - <content><![CDATA[<p>毛毛在人群中牵着我,却很难融入人群,我在林中面对着毛毛,树木的思想却千姿百态地向我涌来。<br>它说,它要将灵魂撕裂,让它暴露在最灼热的阳光下灼烧,要让风刺进来,硬生生扯开一道口子,要让原有的赤色消失殆尽,只留下一堆松散的灰色颗粒,任雨打浮萍。</p> -<p>毛毛和我看到了宇宙熵增,和我见到了熙攘的街道,现在变成了我耳边的风声。<br>是啊,是啊,你不再身陷囹圄,自由不再是攀在高墙上爬山虎的叶子,不再是吹进风间的花粉,不再是藏躲进阴暗土地里的水,不再是破碎割手的杯子片块。<br>但是这个世界还是越来越美了,我独自一人,却很自在,别无所求,只想被阳光晒透,被狂风穿过。渴望成熟,要准备好死去,也准备好重生。</p> -<hr> -<p>小土堆上长出了狗尾巴草,当我靠近时,狗尾巴草会向我轻轻晃动,就像它小时候向我跑来时那样,不同的是,当我向前跑的时候,背后没有一个小小的身影再追过来了,但当我回望小土堆,狗尾巴草依然在摇晃,就像当初给予我回应那样。</p> -<hr> -<p>狗儿要听狗儿歌,<br>毛毛下雨要回家,<br>小狗小狗画梅花,<br>直走就是我们家。</p> -]]></content> - <categories> - <category>gallery</category> - </categories> - </entry> - <entry> <title>二零二二年十二月三十一日</title> <url>/2022/12/31/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E5%8D%81%E4%BA%8C%E6%9C%88%E4%B8%89%E5%8D%81%E4%B8%80%E6%97%A5/</url> <content><![CDATA[<p>我要做时间富人,肆意挥霍,飘在世界上空,什么都不做,静静看着周遭的一切,命运给我什么我就接着,命运拿走什么我就看着,到模糊不见,到夜色如烟。</p> @@ -2294,23 +2326,6 @@ </tags> </entry> <entry> - <title>过度疲劳的六种表现</title> - <url>/2023/10/12/%E8%BF%87%E5%BA%A6%E7%96%B2%E5%8A%B3%E7%9A%84%E5%85%AD%E7%A7%8D%E8%A1%A8%E7%8E%B0/</url> - <content><![CDATA[<ol> -<li>不知不觉就睡着了, 比如在地铁, 公交车这一类很吵闹的地方无意识睡着了。</li> -<li>刚起床就感觉很累,怎么睡都睡不够,醒来就很累,很疲惫,身心俱疲的无力感</li> -<li>长溃疡,结节甚至是囊肿,免疫力下降,反复溃疡,年纪轻轻身上一堆结节和囊肿</li> -<li>比较严重的体臭,口臭,头发油臭,和正常的味道不同,肝功能下降,氨随汗液排出,这种“疲劳臭”很难闻。</li> -<li>脱发长痘痘,痘痘反复发作,年纪轻轻头发大把大把掉,梳头一地头发。</li> -<li>对任何事物都感到厌烦,对任何事物都提不起兴趣,第一反应是很烦,做什么都烦</li> -</ol> -<p>身体不舒服应该第一时间去医院,如果你打算明天去医院看看的话,那今天就不要剧烈运动了,也不要再过度劳累,好今晚好好泡一个热水澡早点睡觉噢。</p> -]]></content> - <tags> - <tag>Life</tag> - </tags> - </entry> - <entry> <title>金匮要略</title> <url>/2023/03/04/%E9%87%91%E5%8C%AE%E8%A6%81%E7%95%A5/</url> <content><![CDATA[<p>臟腑經絡先後病脈證第一問曰:上工治未病,何也?師曰:夫治未病者,見肝之病,知肝傳脾,當先實脾,四季脾王不受邪,即勿補之;中工不曉相傳,見肝之病,不解實脾,惟治肝也。</p> @@ -3578,21 +3593,6 @@ </tags> </entry> <entry> - <title>隐藏一些OCaml Effect的机制,让其语法在精神上更接近delimcc</title> - <url>/2023/06/28/%E9%9A%90%E8%97%8F%E4%B8%80%E4%BA%9BOCaml-Effect%E7%9A%84%E6%9C%BA%E5%88%B6%EF%BC%8C%E8%AE%A9%E5%85%B6%E8%AF%AD%E6%B3%95%E5%9C%A8%E7%B2%BE%E7%A5%9E%E4%B8%8A%E6%9B%B4%E6%8E%A5%E8%BF%91delimcc/</url> - <content><![CDATA[<p><a href="https://github.com/kayceesrk/delimcc_of_fxhandler">delimcc_of_fxhandler这个库</a>在OCaml5的effect handlers上实现了一些delimcc原语(shift/reset, control/prompt这些):</p> -<figure class="highlight ocaml"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> p = new_prompt <span class="literal">()</span> <span class="keyword">in</span></span><br><span class="line"><span class="keyword">assert</span> (<span class="literal">[]</span> = push_prompt p (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> <span class="number">1</span>::<span class="number">2</span>::take_subcont p (<span class="keyword">fun</span> _k -> <span class="literal">[]</span>)));</span><br><span class="line"><span class="keyword">assert</span> ([<span class="number">1</span>;<span class="number">2</span>] = push_prompt p (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> <span class="number">1</span>::<span class="number">2</span>::take_subcont p (<span class="keyword">fun</span> k -> push_subcont k <span class="literal">[]</span>)));</span><br><span class="line"><span class="keyword">assert</span> (<span class="number">135</span> =</span><br><span class="line"> <span class="keyword">let</span> p1 = new_prompt <span class="literal">()</span> <span class="keyword">in</span></span><br><span class="line"> <span class="keyword">let</span> p2 = new_prompt <span class="literal">()</span> <span class="keyword">in</span></span><br><span class="line"> <span class="keyword">let</span> p3 = new_prompt <span class="literal">()</span> <span class="keyword">in</span></span><br><span class="line"> <span class="keyword">let</span> pushtwice sk =</span><br><span class="line"> sk (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> sk (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> shift0 p2 (<span class="keyword">fun</span> sk2 -> sk2 (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> sk2 (<span class="keyword">fun</span> <span class="literal">()</span> -> <span class="number">3</span>))) <span class="literal">()</span>))</span><br><span class="line"> <span class="keyword">in</span></span><br><span class="line"> push_prompt p1 (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> push_prompt p2 (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> push_prompt p3 (<span class="keyword">fun</span> <span class="literal">()</span> -> shift0 p1 pushtwice <span class="literal">()</span>) + <span class="number">10</span>) + <span class="number">1</span>) + <span class="number">100</span>);</span><br><span class="line"></span><br><span class="line">print_endline <span class="string">"Success!"</span></span><br></pre></td></tr></table></figure> - -<p>另外, <a href="https://github.com/avsm/ocaml/commits/effect-syntax">avsm这里</a>可以看到一些OCaml的Effect Syntax进展。</p> -<p>还有 <a href="https://github.com/dhil/ocaml-multicont">multi-shot continuations in OCaml</a>,在这个仓库里面还讨论了一些有趣的问题,例如,OCaml 编译器和runtime会做出一些假设从而进行一些优化,这些优化在使用multi-shot continutation时是不可取的(或完全错误的)。编译器优化导致错误的一个例子是堆到栈的转换,例如:</p> -<figure class="highlight ocaml"><table><tr><td class="code"><pre><span class="line"><span class="comment">(* An illustration of how the heap to stack optimisation is broken.</span></span><br><span class="line"><span class="comment"> * This example is adapted from de Vilhena and Pottier (2021).</span></span><br><span class="line"><span class="comment"> * file: heap2stack.ml</span></span><br><span class="line"><span class="comment"> * compile: ocamlopt -I $(opam var lib)/multicont multicont.cmxa heap2stack.ml</span></span><br><span class="line"><span class="comment"> * run: ./a.out *)</span></span><br><span class="line"></span><br><span class="line"><span class="comment">(* We first require a little bit of setup. The following declares an</span></span><br><span class="line"><span class="comment"> operation `Twice' which we use to implement multiple returns. *)</span></span><br><span class="line"><span class="keyword">type</span> _ <span class="type">Effect</span>.t += <span class="type">Twice</span> : <span class="built_in">unit</span> <span class="type">Effect</span>.t</span><br><span class="line"></span><br><span class="line"><span class="comment">(* The handler `htwice' interprets `Twice' by simply invoking its</span></span><br><span class="line"><span class="comment"> continuation twice. *)</span></span><br><span class="line"><span class="keyword">let</span> htwice : (<span class="built_in">unit</span>, <span class="built_in">unit</span>) <span class="type">Effect</span>.<span class="type">Deep</span>.handler</span><br><span class="line"> = { retc = (<span class="keyword">fun</span> x -> x)</span><br><span class="line"> ; exnc = (<span class="keyword">fun</span> e -> raise e)</span><br><span class="line"> ; effc = (<span class="keyword">fun</span> (<span class="keyword">type</span> a) (eff : a <span class="type">Effect</span>.t) -></span><br><span class="line"> <span class="keyword">let</span> <span class="keyword">open</span> <span class="type">Effect</span>.<span class="type">Deep</span> <span class="keyword">in</span></span><br><span class="line"> <span class="keyword">match</span> eff <span class="keyword">with</span></span><br><span class="line"> | <span class="type">Twice</span> -> <span class="type">Some</span> (<span class="keyword">fun</span> (k : (a, _) continuation) -></span><br><span class="line"> continue (<span class="type">Multicont</span>.<span class="type">Deep</span>.clone_continuation k) <span class="literal">()</span>;</span><br><span class="line"> continue k <span class="literal">()</span>)</span><br><span class="line"> | _ -> <span class="type">None</span>) }</span><br><span class="line"></span><br><span class="line"><span class="comment">(* Now for the interesting stuff. In the code below, the compiler will</span></span><br><span class="line"><span class="comment"> perform an escape analysis on the reference `i' and deduce that it</span></span><br><span class="line"><span class="comment"> does not escape the local scope, because it is unaware of the</span></span><br><span class="line"><span class="comment"> semantics of `perform Twice', hence the optimiser will transform</span></span><br><span class="line"><span class="comment"> `i' into an immediate on the stack to save a heap allocation. As a</span></span><br><span class="line"><span class="comment"> consequence, the assertion `(!i = 1)' will succeed twice, whereas</span></span><br><span class="line"><span class="comment"> it should fail after the second return of `perform Twice'. *)</span></span><br><span class="line"><span class="keyword">let</span> heap2stack <span class="literal">()</span> =</span><br><span class="line"> <span class="type">Effect</span>.<span class="type">Deep</span>.match_with</span><br><span class="line"> (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> <span class="keyword">let</span> i = <span class="built_in">ref</span> <span class="number">0</span> <span class="keyword">in</span></span><br><span class="line"> <span class="type">Effect</span>.perform <span class="type">Twice</span>;</span><br><span class="line"> i := !i + <span class="number">1</span>;</span><br><span class="line"> <span class="type">Printf</span>.printf <span class="string">"i = %d\n%!"</span> !i;</span><br><span class="line"> <span class="keyword">assert</span> (!i = <span class="number">1</span>))</span><br><span class="line"> <span class="literal">()</span> htwice</span><br><span class="line"></span><br><span class="line"><span class="comment">(* The following does not trigger an assertion failure. *)</span></span><br><span class="line"><span class="keyword">let</span> _ = heap2stack <span class="literal">()</span></span><br><span class="line"></span><br><span class="line"><span class="comment">(* To fix this issue, we can wrap reference allocations in an instance</span></span><br><span class="line"><span class="comment"> of `Sys.opaque_identity'. However, this is not really a viable fix</span></span><br><span class="line"><span class="comment"> in general, as we may not have access to the client code that</span></span><br><span class="line"><span class="comment"> allocates the reference! *)</span></span><br><span class="line"><span class="keyword">let</span> heap2stack' <span class="literal">()</span> =</span><br><span class="line"> <span class="type">Effect</span>.<span class="type">Deep</span>.match_with</span><br><span class="line"> (<span class="keyword">fun</span> <span class="literal">()</span> -></span><br><span class="line"> <span class="keyword">let</span> i = <span class="type">Sys</span>.opaque_identity (<span class="built_in">ref</span> <span class="number">0</span>) <span class="keyword">in</span></span><br><span class="line"> <span class="type">Effect</span>.perform <span class="type">Twice</span>;</span><br><span class="line"> i := !i + <span class="number">1</span>;</span><br><span class="line"> <span class="type">Printf</span>.printf <span class="string">"i = %d\n%!"</span> !i;</span><br><span class="line"> <span class="keyword">assert</span> (!i = <span class="number">1</span>))</span><br><span class="line"> <span class="literal">()</span> htwice</span><br><span class="line"></span><br><span class="line"><span class="comment">(* The following triggers an assertion failure. *)</span></span><br><span class="line"><span class="keyword">let</span> _ = heap2stack' <span class="literal">()</span></span><br></pre></td></tr></table></figure> -]]></content> - <tags> - <tag>Technique</tag> - <tag>OCaml</tag> - </tags> - </entry> - <entry> <title>关于</title> <url>/about.html</url> <content><![CDATA[<h2 id="韩暮秋"><a href="#韩暮秋" class="headerlink" title="韩暮秋"></a>韩暮秋</h2><blockquote> @@ -3605,12 +3605,15 @@ <li>邮箱: <a href="[email protected]">[email protected]</a></li> </ul> <hr> -<p>如果你正处在失真的旷野,那我希望能给你带来空寂中的回响,夏夜中的虫鸣,山谷里的清泉。</p> -<p>这是世间所有清澈美好的声响汇聚而成的礼物。</p> -<p>让我们一起钻进祝福的云朵,享受被温暖和柔软包裹的梦境之中。</p> -<p>盘绕在树上的藤蔓开出了最美丽的花。</p> -<p>微笑的花朵向着天空,被树木守护,被一缕透过云层的阳光,穿透了大树的树叶,照耀着,</p> -<p>相拥而眠。</p> +<center> +<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=450 src="//music.163.com/outchain/player?type=1&id=185090912&auto=1&height=430"></iframe> +</center> + + +<p>如果你正在失真的荒野上,渴求那空寂中的一抹回响</p> +<p>我想给你带来冬日暖阳与暮秋山林所描绘的风的形状</p> +<p>这是一方小世界中的部分美好所汇聚而成的礼物</p> +<p>我爱这个因为有我而变得温柔的一方世界,这将是我与周遭一切,热爱一生,共度一生的地方</p> ]]></content> </entry> <entry> |
