问题标签 [nim-lang]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
templates - Nim:如何从另一个迭代器包装/派生一个迭代器?
假设我们有一些existingIterator
迭代任意类型的元素T
。我现在想要实现的是从existingIterator
修改后的行为中派生一个新的迭代器。想想这样的例子:
- 限制原始迭代器的长度,例如
existingIterator.take(n)
. - 映射元素,例如,
existingIterator.map(modifier)
- 过滤某些元素,例如
existingIterator.filter(predicate)
.
在所有这些情况下,我只想生成另一个迭代器,以便可以执行以下操作:
我的一般问题是:如何编写一个通用迭代器或模板,它采用现有迭代器并返回修改后的迭代器?
一个后续问题是为什么标准库中没有这些基本功能——也许我遗漏了一些东西?
这是我尝试过的:
尝试 1
让我们以take(n)
功能为例。我的第一种方法是使用常规泛型iterator
:
这可以编译,但不幸的是,它并没有真正起作用:(1)元素没有正确迭代(它们都只是零,可能是一个错误?),(2)看起来我的程序陷入了无限循环,并且(3) 它只适用于闭包迭代器,这意味着我不能包装任意迭代器。
尝试 2
闭包迭代器的限制表明这个问题实际上需要一个模板解决方案。
这几乎似乎工作(即,模板编译)。但是,如果我现在打电话,for x in infinite.take(10)
我会得到:
我试图附加 a()
来实际“调用”迭代器,但它仍然不起作用。所以它归结为一个问题:我应该如何从模板构造/返回迭代器?
nim-lang - 如何将切片转换为序列?
我想直接从切片指定一个序列(而不是遍历切片并将每个元素单独添加到序列中)。我尝试了几种不同的方法,但显而易见的方法似乎不起作用。
我设法开始工作的唯一一件事是从future
我在文档中找不到任何不涉及从未来导入实验性内容或自己重载序列构造函数的方法。
string - 字符串插值
在 scala 中,您可以轻松地将变量的内容包含在字符串中,如下所示:
这在 nim 中是否可行,在这种情况下,如何实现?
generics - 通用序列
我有以下片段。第二个变量声明虽然没有编译:
在 nim 中是否有可能具有通用序列,例如 java 的 list ?
range - 在范围内
假设您有以下类型:
您想检查某些 int 是否像集合一样落在 Min 内:
可以比以下更优雅地表达它:
python - Nim 相当于 Python 的列表推导
由于 Nim 与 Python 共享很多特性,如果它也实现了Python 的列表推导,我不会感到惊讶:
这在 Nim 中真的可能吗?如果没有,可以用模板/宏来实现吗?
parameter-passing - 在 Nim 中定义多种类型的参数
假设我有两个类和一个以相同方式修改任一类的过程。如何指定参数可以是任一类(而不是为每个类重写或重载函数)?一个简单的例子:
我收到以下错误。
如果我为每个班级使用单独的程序,一切都会很好。
这只是一个很容易重写函数的简单示例。但我希望为更复杂的类和过程执行此操作。在某些情况下,继承可能是合适的,但似乎 Nim 类不能作为变量传递给过程来代替基类。
c - Nim 交叉编译为 C
我写了一个 Nim 程序,
然后我尝试为Linux机器交叉编译,
这产生了以下输出:
此时我切换到nimcache/
目录并尝试执行:
但这给了我一个错误:
我想,“没什么大不了的,我会找到nimbase.h
并把它放到nimcache
那里的目录中”,但在那之后我得到了一个新的错误,
我不确定我应该怎么做。我曾尝试使用该--genScript
选项,但这导致了类似的错误。我正在运行 OS X Yosemite。
谢谢!
更新:
我不确定该选项支持多少架构,但我在What makes Nim 实用博客文章--cpu:
中找到了一个(部分?)列表。我终于打电话了,
这防止了我在我的 Linux 机器上编译时看到的错误。如果您使用的是 Linux 或 OS X,不确定您可以调用的 CPU 架构是什么,
nim-lang - toSeq(some_string) 类型不匹配
我想将 a 转换string
为 a,seq[char]
以便可以在 sequtils 中使用一些 proc,但我遇到了toSeq
模板问题。
例如:
给出编译错误:
查看该模板:https ://github.com/Araq/Nim/blob/master/lib/pure/collections/sequtils.nim#L292
我看到序列的类型是由iter
参数决定的,在这种情况下是string
而不是char
. 这是模板中的错误,还是我错误地使用了此模板?
我正在使用一个相当新的 10.3 版本的 Nim
concurrency - Nim 线程间消息传递:如何避免全局 TChannel?
我有以下线程间通信问题的简单示例:我想在后台线程中运行任意“随时”算法。任何时间算法都会以增量方式执行某些结果类型的计算T
,即它偶尔会产生更新、更精确的结果。用 Nim 的说法,它们可能最好用迭代器来表示。在主线程中,我现在想将每个迭代器包装在自己的线程中,并可以查询线程以获取诸如“是否有可用的新值”或“当前计算结果是什么”之类的内容。
由于我不熟悉 Nim 的并发概念,我很难实现所需的线程间通信。我的想法是使用 aTChannel
进行通信。根据这个论坛帖子, aTChannel
不能与 结合使用,spawn
但需要使用createThread
。我设法得到以下编译和运行:
不幸的是,这没有预期的行为,即我从未在主线程中收到任何东西。我在 IRC 上被告知问题是我不使用全局变量。但即使经过很长时间的思考,我也不明白为什么会失败,也没有办法解决它。问题是我不能简单地使变量thread
和channel
全局变量,因为它们取决于类型T
。我还想避免将其限制为仅运行一个任何时间算法(或其他一些固定数字 N)。我还被告知该方法总体上没有意义,所以也许我只是错过了这个问题有一个完全不同的解决方案?