summaryrefslogtreecommitdiff
path: root/2023
diff options
context:
space:
mode:
Diffstat (limited to '2023')
-rw-r--r--2023/05/31/OCaml_News_20230531/index.html5
-rw-r--r--2023/06/11/OCaml_News_20230611/index.html304
2 files changed, 309 insertions, 0 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&#x2F;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 &lt;&gt; 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>在表没有涉及大小调整操作的情况下,共享哈希表是安全的。在调整大小的情况下,添加&#x2F;删除可能会与任何其他操作产生冲突。</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> &#123;</span><br><span class="line"> <span class="keyword">public</span> &lt;B&gt; B <span class="title function_">accept</span><span class="params">(TreeVisitor&lt;B&gt; v)</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> <span class="title class_">TreeVisitor</span>&lt;B&gt; &#123;</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">&#125;</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> &#123;</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> &#123;</span><br><span class="line"> <span class="built_in">this</span>.value = value;</span><br><span class="line"> &#125;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> &lt;B&gt; B <span class="title function_">accept</span><span class="params">(TreeVisitor&lt;B&gt; v)</span> &#123;</span><br><span class="line"> <span class="keyword">return</span> v.visitLeaf(<span class="built_in">this</span>);</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</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">&#x27;a</span> . <span class="symbol">&#x27;a</span> tree_visitor -&gt; <span class="symbol">&#x27;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">&#x27;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 -&gt; <span class="symbol">&#x27;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">&#x27;a</span> tree_visitor) : <span class="symbol">&#x27;a</span> =</span><br><span class="line"> v#visit_leaf (self :&gt; 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 &quot;visitor.ml&quot;, line 3, characters 28-54:</span><br><span class="line">3 | method virtual accept : &#x27;a . &#x27;a tree_visitor -&gt; &#x27;a</span><br><span class="line"> ^^^^^^^^^^^^^^^^^^^^^^^^^^</span><br><span class="line">Error: The universal type variable &#x27;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">&#x27;a</span>] c (x:<span class="symbol">&#x27;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">&#x27;a</span>] c : <span class="symbol">&#x27;a</span> -&gt; <span class="keyword">object</span> <span class="keyword">constraint</span> <span class="symbol">&#x27;a</span> = <span class="built_in">int</span> <span class="keyword">method</span> x : <span class="symbol">&#x27;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">&#x27;a</span>, <span class="symbol">&#x27;leaf</span>, <span class="symbol">&#x27;node</span>, <span class="symbol">&#x27;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">&#x27;leaf</span> -&gt; <span class="symbol">&#x27;a</span></span><br><span class="line"> <span class="keyword">method</span> <span class="keyword">virtual</span> visit_node : <span class="symbol">&#x27;node</span> -&gt; <span class="symbol">&#x27;a</span></span><br><span class="line"> <span class="keyword">method</span> <span class="keyword">virtual</span> visit_empty : <span class="symbol">&#x27;empty</span> -&gt; <span class="symbol">&#x27;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">&#x27;a</span> .</span><br><span class="line"> (<span class="symbol">&#x27;a</span>, <span class="symbol">&#x27;leaf</span>, <span class="symbol">&#x27;node</span>, <span class="symbol">&#x27;empty</span>) open_tree_visitor -&gt; <span class="symbol">&#x27;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">&#x27;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 :&gt; 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">&#x27;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 :&gt; 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">&#x27;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 :&gt; 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 -&gt;</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> _ -&gt;</span><br><span class="line"> <span class="type">Carbon</span>.<span class="type">Gb</span>.get_intensity env#net</span><br><span class="line"> |&gt; <span class="type">Eio</span>.traceln <span class="string">&quot;%a&quot;</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 -&gt;</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> _ -&gt;</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">&quot;.co2-token&quot;</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"> |&gt; <span class="type">Eio</span>.traceln <span class="string">&quot;%a&quot;</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>