diff options
| author | muqiuhan <[email protected]> | 2023-06-11 08:51:01 +0000 |
|---|---|---|
| committer | muqiuhan <[email protected]> | 2023-06-11 08:51:01 +0000 |
| commit | 1394455d95ddda6a495c0fdc8cad3faa3b39686c (patch) | |
| tree | a76dbfaaf76af67cbb093327c42b841c36f881c1 | |
| parent | 37bf6a99c7863f302bb82b986a63968ba44afbc9 (diff) | |
| download | blog-1394455d95ddda6a495c0fdc8cad3faa3b39686c.tar.gz | |
deploy: 55441d24c8152e202e3c9cd202d3d08edc1dd72c
| -rw-r--r-- | 2023/05/31/OCaml_News_20230531/index.html | 5 | ||||
| -rw-r--r-- | 2023/06/11/OCaml_News_20230611/index.html | 304 | ||||
| -rw-r--r-- | archives/2023/06/index.html | 178 | ||||
| -rw-r--r-- | archives/2023/index.html | 36 | ||||
| -rw-r--r-- | archives/2023/page/2/index.html | 36 | ||||
| -rw-r--r-- | archives/2023/page/3/index.html | 18 | ||||
| -rw-r--r-- | archives/index.html | 36 | ||||
| -rw-r--r-- | archives/page/2/index.html | 36 | ||||
| -rw-r--r-- | archives/page/3/index.html | 36 | ||||
| -rw-r--r-- | archives/page/4/index.html | 18 | ||||
| -rw-r--r-- | tags/OCaml/index.html | 18 | ||||
| -rw-r--r-- | tags/Technique/index.html | 18 |
12 files changed, 649 insertions, 90 deletions
diff --git a/2023/05/31/OCaml_News_20230531/index.html b/2023/05/31/OCaml_News_20230531/index.html index 792496fe..4431203d 100644 --- a/2023/05/31/OCaml_News_20230531/index.html +++ b/2023/05/31/OCaml_News_20230531/index.html @@ -223,6 +223,11 @@ <nav class="post-nav"> <div class="prev-item"> + <div class="icon arrow-left"></div> + <div class="post-link"> + <a href="/2023/06/11/OCaml_News_20230611/">Prev</a> + </div> + </div> <div class="next-item"> diff --git a/2023/06/11/OCaml_News_20230611/index.html b/2023/06/11/OCaml_News_20230611/index.html new file mode 100644 index 00000000..d120e386 --- /dev/null +++ b/2023/06/11/OCaml_News_20230611/index.html @@ -0,0 +1,304 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> +<meta name="viewport" + content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> +<meta http-equiv="X-UA-Compatible" content="ie=edge"> + + <meta name="author" content="含暮秋"> + + + <meta name="subtitle" content="暮秋小屋"> + + + <meta name="description" content="不卑不亢的码农, 朴素的民谣诗人"> + + + <meta name="keywords" content="韩暮秋,MuqiuHan"> + + + + +<title>OCaml News 2023/6/11 | 暮秋小屋</title> + + + + + +<style> + @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&family=Roboto+Mono&display=swap'); +</style> + + + + <!-- stylesheets list from _config.yml --> + + <link rel="stylesheet" href="/css/style.css"> + + + + + + <!-- scripts list from _config.yml --> + + <script src="/js/frame.js"></script> + + + + + + <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> + <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> + + + + + + + + <!-- hexo injector head_end start --> +<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css"> + +<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/style.css"> +<!-- hexo injector head_end end --><meta name="generator" content="Hexo 6.3.0"></head> + <body> + <div class="mask-border"> + </div> + + <div class="wrapper"> + + <div class="header"> + <div class="flex-container"> + <div class="header-inner"> + <div class="site-brand-container"> + <a href="/"> + + 暮秋小屋 + + </a> + </div> + <div id="menu-btn" class="menu-btn" onclick="toggleMenu()"> + Menu + </div> + <nav class="site-nav"> + <ul class="menu-list"> + + + <li class="menu-item"> + <a href="/">主页</a> + </li> + + + + <li class="menu-item"> + <a href="/tags/Technique/">技术</a> + </li> + + + + <li class="menu-item"> + <a href="/Projects">项目</a> + </li> + + + + <li class="menu-item"> + <a href="/categories/gallery/">日记本</a> + </li> + + + + <li class="menu-item"> + <a href="/about">关于</a> + </li> + + + + </ul> + </nav> + </div> + </div> +</div> + + + <div class="main"> + <div class="flex-container"> + <article id="post"> + + + <div class="post-head"> + <div class="post-info"> + <div class="tag-list"> + + + <span class="post-tag"> + <a href="/tags/OCaml/"> + OCaml + </a> + </span> + + <span class="post-tag"> + <a href="/tags/Technique/"> + Technique + </a> + </span> + + + </div> + <div class="post-title"> + + + OCaml News 2023/6/11 + + + </div> + <span class="post-date"> + Jun 11, 2023 + </span> + </div> + <div class="post-img"> + + <div class="h-line-primary"></div> + + </div> +</div> + <div class="post-content"> + <h1 id="二〇二三年五月三十一日-二〇二三年六月十一日"><a href="#二〇二三年五月三十一日-二〇二三年六月十一日" class="headerlink" title="二〇二三年五月三十一日 - 二〇二三年六月十一日"></a>二〇二三年五月三十一日 - 二〇二三年六月十一日</h1><h2 id="Lambda演算中的可计算性极限"><a href="#Lambda演算中的可计算性极限" class="headerlink" title="Lambda演算中的可计算性极限"></a>Lambda演算中的可计算性极限</h2><p>OCaml 的用户可能有兴趣阅读有关 lambda 演算的理论论文。</p> +<p>“ <a target="_blank" rel="noopener" href="https://hbr.github.io/Lambda-Calculus/computability/text.html">Limits of Computability in Lambda Calculus</a>“ 这篇论文介绍了在lambda演算中有一些函数是不可计算的。</p> +<p>详细讨论可以看<a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/limits-of-computability-in-lambda-calculus/12295">论坛原帖</a></p> +<h2 id="OCaml-5-1-0-alpha2"><a href="#OCaml-5-1-0-alpha2" class="headerlink" title="OCaml 5.1.0~alpha2"></a>OCaml 5.1.0~alpha2</h2><p>随着 OCaml 5.1.0 持续稳定的工作进展,OCaml 5.1.0 的第二个 alpha 版本发布了, 这个版本修复了GC和Windows ABI的问题。<br>除此之外,类型系统兼容性得到增强,恢复支持 s390x/IBM Z</p> +<p>详细的更新可以查看 <a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/second-alpha-release-of-ocaml-5-1-0/12299">论坛原帖</a></p> +<h2 id="OCaml中能否实现-constraint-不等"><a href="#OCaml中能否实现-constraint-不等" class="headerlink" title="OCaml中能否实现 constraint 不等"></a>OCaml中能否实现 constraint 不等</h2><p>OCaml提供了对类型定义添加约束的方法, 即<code>constraint</code>:</p> +<figure class="highlight ocaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">module</span> <span class="type">A</span> = <span class="keyword">struct</span> <span class="keyword">type</span> t = <span class="built_in">int</span> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">module</span> <span class="type">B</span> = <span class="keyword">struct</span> <span class="keyword">type</span> t = <span class="built_in">float</span> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="comment">(** Error: This type constructor expands to type t but is used here with type float *)</span></span><br><span class="line"><span class="keyword">type</span> t = <span class="type">A</span>.t <span class="keyword">constraint</span> t = <span class="type">B</span>.t</span><br></pre></td></tr></table></figure> + +<p>能否实现判断两个类型是不兼容的呢? 比如: <code>type t = A.t constraint t <> B.t</code>。</p> +<p>类型相关的理论在学了在学了呜呜,目前来看这不是个好的做法…,详细可以看<a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/type-inequality-constraints/12364#main-container">论坛原帖</a></p> +<h2 id="在OCaml5的并行程序中使用全局哈希表是否安全?"><a href="#在OCaml5的并行程序中使用全局哈希表是否安全?" class="headerlink" title="在OCaml5的并行程序中使用全局哈希表是否安全?"></a>在OCaml5的并行程序中使用全局哈希表是否安全?</h2><p>这里指的应该是 <code>Stdlib.Hashtbl</code>。</p> +<p>只能安全一点点,因为对哈希表访问没有同步,所以只是内存安全而不是线程安全。<br>文档指出,对哈希表的不同步访问是程序员的锅,要么使用锁保护表,要么用并发哈希表的不同实现。<br>在表没有涉及大小调整操作的情况下,共享哈希表是安全的。在调整大小的情况下,添加/删除可能会与任何其他操作产生冲突。</p> +<p><a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/is-it-safe-to-use-a-global-hash-table-in-an-ocaml-5-parallel-program/11144/1">查看论坛原帖</a></p> +<h2 id="谈谈你心目中理想ML的样子吧!"><a href="#谈谈你心目中理想ML的样子吧!" class="headerlink" title="谈谈你心目中理想ML的样子吧!"></a>谈谈你心目中理想ML的样子吧!</h2><ul> +<li>Haskell的类型系统和简洁 </li> +<li>OCaml的模块系统和对象系统</li> +<li>Rust的low level内存控制和借用以及并发检查</li> +<li>Lisp的宏系统和REPL</li> +<li>JetBrains相关IDE支持</li> +<li>和x86_64汇编一样的编译速度</li> +</ul> +<p>有种许愿的美,🙏</p> +<p><a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/whats-your-laundry-list-of-features-for-an-ideal-ml/10217/5">查看论坛上其他愿望</a></p> +<h2 id="OOP-Visitors在Polymorphic情况下的类型错误"><a href="#OOP-Visitors在Polymorphic情况下的类型错误" class="headerlink" title="OOP Visitors在Polymorphic情况下的类型错误"></a>OOP Visitors在Polymorphic情况下的类型错误</h2><p>像Java里面:</p> +<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">interface</span> <span class="title class_">Tree</span> {</span><br><span class="line"> <span class="keyword">public</span> <B> B <span class="title function_">accept</span><span class="params">(TreeVisitor<B> v)</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> <span class="title class_">TreeVisitor</span><B> {</span><br><span class="line"> <span class="keyword">public</span> B <span class="title function_">visitLeaf</span><span class="params">(Leaf t)</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Leaf</span> <span class="keyword">implements</span> <span class="title class_">Tree</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">final</span> <span class="type">int</span> value;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">Leaf</span><span class="params">(<span class="type">int</span> value)</span> {</span><br><span class="line"> <span class="built_in">this</span>.value = value;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <B> B <span class="title function_">accept</span><span class="params">(TreeVisitor<B> v)</span> {</span><br><span class="line"> <span class="keyword">return</span> v.visitLeaf(<span class="built_in">this</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure> + +<p>要是直接翻译成OCaml:</p> +<figure class="highlight ocaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="keyword">virtual</span> tree =</span><br><span class="line"> <span class="keyword">object</span></span><br><span class="line"> <span class="keyword">method</span> <span class="keyword">virtual</span> accept : <span class="symbol">'a</span> . <span class="symbol">'a</span> tree_visitor -> <span class="symbol">'a</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">and</span> <span class="keyword">virtual</span> [<span class="symbol">'a</span>] tree_visitor =</span><br><span class="line"> <span class="keyword">object</span></span><br><span class="line"> <span class="keyword">method</span> <span class="keyword">virtual</span> visit_leaf : (leaf -> <span class="symbol">'a</span>)</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">and</span> leaf (i : <span class="built_in">int</span>) =</span><br><span class="line"> <span class="keyword">object</span> (self)</span><br><span class="line"> <span class="keyword">method</span> get = i</span><br><span class="line"></span><br><span class="line"> <span class="keyword">method</span> accept (v : <span class="symbol">'a</span> tree_visitor) : <span class="symbol">'a</span> =</span><br><span class="line"> v#visit_leaf (self :> leaf)</span><br><span class="line"> <span class="keyword">end</span></span><br></pre></td></tr></table></figure> + +<p>是会报错滴:</p> +<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">File "visitor.ml", line 3, characters 28-54:</span><br><span class="line">3 | method virtual accept : 'a . 'a tree_visitor -> 'a</span><br><span class="line"> ^^^^^^^^^^^^^^^^^^^^^^^^^^</span><br><span class="line">Error: The universal type variable 'a cannot be generalized:</span><br><span class="line"> it escapes its scope.</span><br></pre></td></tr></table></figure> + +<p>OCaml的类在定义时是单态的,比如:</p> +<figure class="highlight ocaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> [<span class="symbol">'a</span>] c (x:<span class="symbol">'a</span>) = </span><br><span class="line"> <span class="keyword">object</span></span><br><span class="line"> <span class="keyword">method</span> x = x</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">and</span> d = </span><br><span class="line"> <span class="keyword">object</span></span><br><span class="line"> <span class="keyword">method</span> strange = (<span class="keyword">new</span> c <span class="number">0</span>)#x</span><br><span class="line"> <span class="keyword">end</span></span><br></pre></td></tr></table></figure> + +<p>这里<code>c</code>是:</p> +<figure class="highlight ocaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> [<span class="symbol">'a</span>] c : <span class="symbol">'a</span> -> <span class="keyword">object</span> <span class="keyword">constraint</span> <span class="symbol">'a</span> = <span class="built_in">int</span> <span class="keyword">method</span> x : <span class="symbol">'a</span> <span class="keyword">end</span></span><br></pre></td></tr></table></figure> +<p>因为在d里面 <code>new c 0</code> 定义了一个 <code>int c</code> 的对象。</p> +<p>所以正确的写法应该是:</p> +<figure class="highlight ocaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="keyword">virtual</span> [<span class="symbol">'a</span>, <span class="symbol">'leaf</span>, <span class="symbol">'node</span>, <span class="symbol">'empty</span>] open_tree_visitor = </span><br><span class="line"> <span class="keyword">object</span></span><br><span class="line"> <span class="keyword">method</span> <span class="keyword">virtual</span> visit_leaf : <span class="symbol">'leaf</span> -> <span class="symbol">'a</span></span><br><span class="line"> <span class="keyword">method</span> <span class="keyword">virtual</span> visit_node : <span class="symbol">'node</span> -> <span class="symbol">'a</span></span><br><span class="line"> <span class="keyword">method</span> <span class="keyword">virtual</span> visit_empty : <span class="symbol">'empty</span> -> <span class="symbol">'a</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="keyword">virtual</span> tree = </span><br><span class="line"> <span class="keyword">object</span></span><br><span class="line"> <span class="keyword">method</span> <span class="keyword">virtual</span> accept : <span class="symbol">'a</span> .</span><br><span class="line"> (<span class="symbol">'a</span>, <span class="symbol">'leaf</span>, <span class="symbol">'node</span>, <span class="symbol">'empty</span>) open_tree_visitor -> <span class="symbol">'a</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">and</span> leaf (i : <span class="built_in">int</span>) = </span><br><span class="line"> <span class="keyword">object</span> (self:<span class="symbol">'self</span>)</span><br><span class="line"> <span class="keyword">inherit</span> tree</span><br><span class="line"> <span class="keyword">method</span> get = i</span><br><span class="line"> <span class="keyword">method</span> accept v = v#visit_leaf (self :> leaf)</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">and</span> node (x : tree) (y: tree) = </span><br><span class="line"> <span class="keyword">object</span> (self:<span class="symbol">'self</span>)</span><br><span class="line"> <span class="keyword">inherit</span> tree</span><br><span class="line"> <span class="keyword">method</span> left = x</span><br><span class="line"> <span class="keyword">method</span> right = y</span><br><span class="line"> <span class="keyword">method</span> accept v = v#visit_node (self :> node)</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">and</span> empty = </span><br><span class="line"> <span class="keyword">object</span> (self:<span class="symbol">'self</span>)</span><br><span class="line"> <span class="keyword">inherit</span> tree</span><br><span class="line"> <span class="keyword">method</span> accept v = v#visit_empty (self :> empty)</span><br><span class="line"> <span class="keyword">end</span></span><br></pre></td></tr></table></figure> + +<p><a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/type-errors-in-polymorphic-oop-visitors/12357">查看论坛原帖</a></p> +<h2 id="进一步约束模块的接口"><a href="#进一步约束模块的接口" class="headerlink" title="进一步约束模块的接口"></a>进一步约束模块的接口</h2><blockquote> +<p>基于dune,有一个模块<code>A.ml</code>它的接口是<code>A.mli</code>,但是当它在主模块中时,我想使用进一步约束过的的接口<code>A_sub.mli</code>,因为只有<code>A_Sub</code>的功能对用户有用。</p> +</blockquote> +<p>其实在library下面声明一个和library同名的 <code>xxx.ml</code>,在里面写 <code>module A = struct include A end</code> 就可以啦,很常见的做法。</p> +<p>详细讨论可以<a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/export-wrapped-modules-with-a-restricted-interface/12361">查看论坛原帖</a></p> +<h2 id="OCaml环不环保?"><a href="#OCaml环不环保?" class="headerlink" title="OCaml环不环保?"></a>OCaml环不环保?</h2><p><a target="_blank" rel="noopener" href="https://infra.ocaml.org/2023/05/30/emissions-monitoring.html">这篇文章</a>说道,对于在 ocaml.org 集群中监测的19台机器,<br>每周大约产生70公斤的二氧化碳当量, </p> +<p>自 ocaml.org 重新设计以来, 社区一直致力于对环境影响负责。第一步是通过计算使用的能源总量来准确量化影响,为了确定未来所做的任何改善是否能减少二氧化碳排放量。</p> +<p>为此,开发了一个用于获取各种碳强度API的HTTP客户端: <a target="_blank" rel="noopener" href="https://github.com/geocaml/carbon-intensity">carbon-intensity</a></p> +<p>英国特定地区API的非常简单,使用只需要用户提供Eio的网络功能:</p> +<figure class="highlight ocaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"># <span class="type">Eio_main</span>.run @@ <span class="keyword">fun</span> env -></span><br><span class="line"> <span class="type">Mirage_crypto_rng_eio</span>.run (<span class="keyword">module</span> <span class="type">Mirage_crypto_rng</span>.<span class="type">Fortuna</span>) env @@ <span class="keyword">fun</span> _ -></span><br><span class="line"> <span class="type">Carbon</span>.<span class="type">Gb</span>.get_intensity env#net</span><br><span class="line"> |> <span class="type">Eio</span>.traceln <span class="string">"%a"</span> <span class="type">Carbon</span>.<span class="type">Gb</span>.<span class="type">Intensity</span>.pp;;</span><br><span class="line">+period: <span class="number">2022</span>-<span class="number">08</span>-<span class="number">28</span>T17:<span class="number">30</span>Z - <span class="number">2022</span>-<span class="number">08</span>-<span class="number">28</span>T18:<span class="number">00</span>Z</span><br><span class="line">+forecast: <span class="number">255</span> gCO2/kWh</span><br><span class="line">+actual: <span class="type">None</span></span><br><span class="line">+index: high</span><br><span class="line">+</span><br><span class="line">- : <span class="built_in">unit</span> = <span class="literal">()</span></span><br></pre></td></tr></table></figure> + +<p>某些API需要更多配置,例如法国的需要token:</p> +<figure class="highlight ocaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"># <span class="type">Eio_main</span>.run @@ <span class="keyword">fun</span> env -></span><br><span class="line"> <span class="type">Mirage_crypto_rng_eio</span>.run (<span class="keyword">module</span> <span class="type">Mirage_crypto_rng</span>.<span class="type">Fortuna</span>) env @@ <span class="keyword">fun</span> _ -></span><br><span class="line"> <span class="keyword">let</span> token = <span class="type">Eio</span>.<span class="type">Path</span>.(load (env#fs / <span class="string">".co2-token"</span>)) <span class="keyword">in</span></span><br><span class="line"> <span class="keyword">let</span> t = <span class="type">Carbon</span>.<span class="type">Co2_signal</span>.v token <span class="keyword">in</span></span><br><span class="line"> <span class="type">Carbon</span>.<span class="type">Co2_signal</span>.get_intensity ~net:env#net ~country_code:<span class="type">`FR</span> t</span><br><span class="line"> |> <span class="type">Eio</span>.traceln <span class="string">"%a"</span> <span class="type">Carbon</span>.<span class="type">Co2_signal</span>.<span class="type">Intensity</span>.pp;;</span><br><span class="line">+country: <span class="type">FR</span></span><br><span class="line">+datetime: <span class="number">2022</span>-<span class="number">08</span>-<span class="number">29</span>T11:<span class="number">00</span>:<span class="number">00.000</span>Z</span><br><span class="line">+intensity: <span class="number">99</span> gCO2/kWh</span><br><span class="line">+fossil fuel percentage: <span class="number">15.230000</span></span><br><span class="line">- : <span class="built_in">unit</span> = <span class="literal">()</span></span><br></pre></td></tr></table></figure> + +<p>更详细的可以看<a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/initial-emissions-monitoring-of-the-ocaml-org-infrastructure/12335">论坛原帖</a>, 以及论坛上<a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/ocaml-carbon-footprint/8580">关于carbon-intensity的帖子</a></p> +<h2 id="float-of-int的细节"><a href="#float-of-int的细节" class="headerlink" title="float_of_int的细节"></a>float_of_int的细节</h2><p>试图弄清楚 <code>float_of_int</code> 在amd64和arm64上的行为, 生成的 Cmm 大概是<br><code>box_float (Cop(Cfloatofint (untag_int myfloat)))</code></p> +<p>在 amd64 上,它被转换为序列:</p> +<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">(** untag_int *)</span><br><span class="line">sarq $1, %rax</span><br><span class="line">cvtsi2sdq %rax, %xmm0</span><br></pre></td></tr></table></figure> + +<p>而在arm64上使用scvtf实现。</p> +<p><a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/how-is-cfloatofint-translated/12342">论坛原帖</a></p> +<h2 id="Debugging-Native-Code-in-OCaml!"><a href="#Debugging-Native-Code-in-OCaml!" class="headerlink" title="Debugging Native Code in OCaml!"></a>Debugging Native Code in OCaml!</h2><p><a target="_blank" rel="noopener" href="https://www.youtube.com/watch?v=OV19_FqAUCw">本视频</a>适用于:</p> +<ul> +<li>非 OCaml 开发人员对 OCaml 的工作原理感到好奇</li> +<li>中级 OCaml 开发人员</li> +</ul> +<p>更多讨论可以看<a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/ann-debugging-native-code-in-second-ocaml-youtube-video/12315">论坛原帖</a></p> +<h2 id="Outreachy-Summer-2023"><a href="#Outreachy-Summer-2023" class="headerlink" title="Outreachy Summer 2023"></a>Outreachy Summer 2023</h2><p>Outreachy是一项带薪远程实习计划,目的是促进开源和开放科学的多样性。Outreachy的实习是为那些在本国()技术行业面临代表性不足、歧视或系统性偏见的人提供的。</p> +<p>关于今年Outreachy的信息可以看这个帖子: <a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/outreachy-summer-2023/11159/2">Outreachy Summer 2023</a><br>如果想加入,可以看: <a target="_blank" rel="noopener" href="https://discuss.ocaml.org/t/become-an-outreachy-mentor-support-the-growth-and-diversity-of-the-ocaml-community/8213">Become an Outreachy Mentor: support the growth and diversity of the OCaml community</a></p> +<h2 id="一些生态"><a href="#一些生态" class="headerlink" title="一些生态"></a>一些生态</h2><ul> +<li><a target="_blank" rel="noopener" href="https://github.com/c-cube/ocaml-minisat/">OCaml-Minisat github repo</a> minisat是一个小巧快速的SAT Solver, 这是其OCaml Bining</li> +<li><a target="_blank" rel="noopener" href="https://github.com/ocaml/MPP-language-blender">MPP</a> 兼容OCaml5咯, mpp就是meta preprocesser</li> +<li><a target="_blank" rel="noopener" href="https://github.com/mjambon/caml2html">caml2html</a>可以将OCaml源码文件转换成带高亮的HTML</li> +<li><a target="_blank" rel="noopener" href="https://github.com/c-cube/ocaml-containers/releases/tag/v3.12">containers</a> 3.12发布了</li> +<li><a target="_blank" rel="noopener" href="https://github.com/ocaml-multicore/multicoretests">multicoretests</a>是用于测试Multicore OCaml 的 PBT 测试套件和库</li> +</ul> + +</div> + +<script> + window.onload = detectors(); +</script> + <div class="post-footer"> + <div class="h-line-primary"></div> + <nav class="post-nav"> + <div class="prev-item"> + + </div> + <div class="next-item"> + + <div class="icon arrow-right"></div> + <div class="post-link"> + <a href="/2023/05/31/OCaml_News_20230531/">Next</a> + </div> + + </div> + </nav> +</div> + + + <div class="post-comment"> + + + + + + + +</div> + + +</article> + </div> + </div> + + <div class="footer"> + <div class="flex-container"> + <div class="footer-text"> + + + | + + + 希望路过的人可以添点柴火让这里暖和点 + + </div> + </div> +</div> + + </div> + + + + + </body> +</html> diff --git a/archives/2023/06/index.html b/archives/2023/06/index.html new file mode 100644 index 00000000..ed161d8f --- /dev/null +++ b/archives/2023/06/index.html @@ -0,0 +1,178 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8"> +<meta name="viewport" + content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> +<meta http-equiv="X-UA-Compatible" content="ie=edge"> + + <meta name="author" content="含暮秋"> + + + <meta name="subtitle" content="暮秋小屋"> + + + <meta name="description" content="不卑不亢的码农, 朴素的民谣诗人"> + + + <meta name="keywords" content="韩暮秋,MuqiuHan"> + + + + +<title>Archive: 2023/6 | 暮秋小屋</title> + + + + + +<style> + @import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&family=Roboto+Mono&display=swap'); +</style> + + + + <!-- stylesheets list from _config.yml --> + + <link rel="stylesheet" href="/css/style.css"> + + + + + + <!-- scripts list from _config.yml --> + + <script src="/js/frame.js"></script> + + + + + + <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> + <script id="MathJax-script" async src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js"></script> + + + + + + + + <!-- hexo injector head_end start --> +<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/katex.min.css"> + +<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/style.css"> +<!-- hexo injector head_end end --><meta name="generator" content="Hexo 6.3.0"></head> + <body> + <div class="mask-border"> + </div> + + <div class="wrapper"> + + <div class="header"> + <div class="flex-container"> + <div class="header-inner"> + <div class="site-brand-container"> + <a href="/"> + + 暮秋小屋 + + </a> + </div> + <div id="menu-btn" class="menu-btn" onclick="toggleMenu()"> + Menu + </div> + <nav class="site-nav"> + <ul class="menu-list"> + + + <li class="menu-item"> + <a href="/">主页</a> + </li> + + + + <li class="menu-item"> + <a href="/tags/Technique/">技术</a> + </li> + + + + <li class="menu-item"> + <a href="/Projects">项目</a> + </li> + + + + <li class="menu-item"> + <a href="/categories/gallery/">日记本</a> + </li> + + + + <li class="menu-item"> + <a href="/about">关于</a> + </li> + + + + </ul> + </nav> + </div> + </div> +</div> + + + <div class="main"> + <div class="flex-container"> + <div class="post-list"> + + + + + + + <div class="year-title">2023</div> + + + <div class="post-list-item"> + <div class="post-title"> + <a href="/2023/06/11/OCaml_News_20230611/"> + + OCaml News 2023/6/11 + + </a> + </div> + + <span class="post-date">Jun 11, 2023</span> + </div> + + + <div id="paginator"> + + </div> +</div> + + </div> + </div> + + <div class="footer"> + <div class="flex-container"> + <div class="footer-text"> + + + | + + + 希望路过的人可以添点柴火让这里暖和点 + + </div> + </div> +</div> + + </div> + + + + + </body> +</html> diff --git a/archives/2023/index.html b/archives/2023/index.html index 58e321a3..8a7a12f3 100644 --- a/archives/2023/index.html +++ b/archives/2023/index.html @@ -136,6 +136,24 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2023/06/11/OCaml_News_20230611/"> + + OCaml News 2023/6/11 + + </a> + </div> + + <span class="post-date">Jun 11, 2023</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/2023/05/31/OCaml_News_20230531/"> OCaml News 2023/5/31 @@ -291,24 +309,6 @@ </div> - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2023/04/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%9B%9B%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> - - 二零二三年四月二十五日 - - </a> - </div> - - <span class="post-date">Apr 25, 2023</span> - </div> - - <div id="paginator"> <div class=paginator> diff --git a/archives/2023/page/2/index.html b/archives/2023/page/2/index.html index 1f58aa73..c292b129 100644 --- a/archives/2023/page/2/index.html +++ b/archives/2023/page/2/index.html @@ -136,6 +136,24 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2023/04/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%9B%9B%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> + + 二零二三年四月二十五日 + + </a> + </div> + + <span class="post-date">Apr 25, 2023</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/2023/04/22/%E6%B2%99%E6%BC%A0/"> 沙漠 @@ -291,24 +309,6 @@ </div> - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2023/02/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> - - 二零二三年二月二十五日 - - </a> - </div> - - <span class="post-date">Feb 25, 2023</span> - </div> - - <div id="paginator"> <div class=paginator> diff --git a/archives/2023/page/3/index.html b/archives/2023/page/3/index.html index 92a206c8..5e3b47c1 100644 --- a/archives/2023/page/3/index.html +++ b/archives/2023/page/3/index.html @@ -136,6 +136,24 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2023/02/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> + + 二零二三年二月二十五日 + + </a> + </div> + + <span class="post-date">Feb 25, 2023</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/2023/02/24/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%9B%9B%E6%97%A5/"> 二零二三年二月二十四日 diff --git a/archives/index.html b/archives/index.html index bec9a7dc..6c769a9c 100644 --- a/archives/index.html +++ b/archives/index.html @@ -136,6 +136,24 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2023/06/11/OCaml_News_20230611/"> + + OCaml News 2023/6/11 + + </a> + </div> + + <span class="post-date">Jun 11, 2023</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/2023/05/31/OCaml_News_20230531/"> OCaml News 2023/5/31 @@ -291,24 +309,6 @@ </div> - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2023/04/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%9B%9B%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> - - 二零二三年四月二十五日 - - </a> - </div> - - <span class="post-date">Apr 25, 2023</span> - </div> - - <div id="paginator"> <div class=paginator> diff --git a/archives/page/2/index.html b/archives/page/2/index.html index e5713b86..53ed07d2 100644 --- a/archives/page/2/index.html +++ b/archives/page/2/index.html @@ -136,6 +136,24 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2023/04/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E5%9B%9B%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> + + 二零二三年四月二十五日 + + </a> + </div> + + <span class="post-date">Apr 25, 2023</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/2023/04/22/%E6%B2%99%E6%BC%A0/"> 沙漠 @@ -291,24 +309,6 @@ </div> - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2023/02/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> - - 二零二三年二月二十五日 - - </a> - </div> - - <span class="post-date">Feb 25, 2023</span> - </div> - - <div id="paginator"> <div class=paginator> diff --git a/archives/page/3/index.html b/archives/page/3/index.html index 4062109f..8c7ced0b 100644 --- a/archives/page/3/index.html +++ b/archives/page/3/index.html @@ -136,6 +136,24 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2023/02/25/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E4%BA%94%E6%97%A5/"> + + 二零二三年二月二十五日 + + </a> + </div> + + <span class="post-date">Feb 25, 2023</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/2023/02/24/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%B8%89%E5%B9%B4%E4%BA%8C%E6%9C%88%E4%BA%8C%E5%8D%81%E5%9B%9B%E6%97%A5/"> 二零二三年二月二十四日 @@ -293,24 +311,6 @@ </div> - - - - - - <div class="post-list-item"> - <div class="post-title"> - <a href="/2022/08/21/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E5%85%AB%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%80%E6%97%A5/"> - - 二零二二年八月二十一日 - - </a> - </div> - - <span class="post-date">Aug 21, 2022</span> - </div> - - <div id="paginator"> <div class=paginator> diff --git a/archives/page/4/index.html b/archives/page/4/index.html index 9389559f..be1b76f0 100644 --- a/archives/page/4/index.html +++ b/archives/page/4/index.html @@ -136,6 +136,24 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2022/08/21/%E4%BA%8C%E9%9B%B6%E4%BA%8C%E4%BA%8C%E5%B9%B4%E5%85%AB%E6%9C%88%E4%BA%8C%E5%8D%81%E4%B8%80%E6%97%A5/"> + + 二零二二年八月二十一日 + + </a> + </div> + + <span class="post-date">Aug 21, 2022</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/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/"> 二零二二年三月十四日 diff --git a/tags/OCaml/index.html b/tags/OCaml/index.html index de3851f8..f6d128c4 100644 --- a/tags/OCaml/index.html +++ b/tags/OCaml/index.html @@ -143,6 +143,24 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2023/06/11/OCaml_News_20230611/"> + + OCaml News 2023/6/11 + + </a> + </div> + + <span class="post-date">Jun 11, 2023</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/2023/05/31/OCaml_News_20230531/"> OCaml News 2023/5/31 diff --git a/tags/Technique/index.html b/tags/Technique/index.html index 26e10bfa..f8379f93 100644 --- a/tags/Technique/index.html +++ b/tags/Technique/index.html @@ -143,6 +143,24 @@ <div class="post-list-item"> <div class="post-title"> + <a href="/2023/06/11/OCaml_News_20230611/"> + + OCaml News 2023/6/11 + + </a> + </div> + + <span class="post-date">Jun 11, 2023</span> + </div> + + + + + + + + <div class="post-list-item"> + <div class="post-title"> <a href="/2023/05/31/OCaml_News_20230531/"> OCaml News 2023/5/31 |
