问题标签 [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.
import - 评估表达式并创建导入的宏
这可能看起来很奇怪,而且可能是不可能的,但我想知道是否有一种方法可以创建一个宏来评估传递的表达式并执行import
.
如果字符串文字是表达式,我可以很容易地让它工作:
但是如果传递了一个变量,这当然会失败。
(请注意,导入可能是模块的字符串路径。)
我已经尝试对宏进行许多调整并搜索了文档和源代码,但我只是找不到一种方法来获得ex: expr
在import
.
我可以让宏创建一个echo
调用,该调用显示传递的字符串,但任何将它与导入一起使用的尝试最终都会使用变量名本身。
我想这是因为在评估宏本身时该值似乎不可用。是否有可能做到这一点,如果可以,怎么做?
constants - proc 内部的 const 与外部的 const 之间的区别
这可能是一个非常愚蠢的问题,但除了可见性之外,const
内部proc
与外部之间是否有任何真正的区别?
就像在内部一样,const
每次proc
调用时堆栈都会增长和缩小,还是因为它const
只是在应用程序期间保存在静态内存位置?
我专门询问 Nim,但也欢迎对其他语言的差异/相似之处进行反思。
unit-testing - Nim 中的单元测试:是否可以在编译时获取源文件的名称?
我正在计划一个包含多个模块的项目,并且我正在寻找一个很好的解决方案来一次运行项目中的所有现有单元测试。我想出了以下想法:我可以运行nim --define:testing main.nim
并使用以下模板作为我所有单元测试的包装器。
到目前为止,这似乎运作良好。
作为一个小调整,我想知道我是否真的可以打印出调用runUnitTests
模板的文件名。是否有任何反射机制可以在编译时获取源文件名?
string - Nim 中的字符串到底是什么?
据我了解,Nim 中的字符串基本上是一个可变的字节序列,并且它们在分配时被复制。
鉴于此,我假设它sizeof
会告诉我(如len
)字节数,但它总是8
在我的 64 位机器上给出,所以它似乎持有一个指针。
鉴于此,我有以下问题......
复制作业的动机是什么?是因为它们是可变的吗?
是否有过分配时不复制的时候?(我假设非
var
函数参数不会复制。还有其他吗?)它们是否进行了优化,以至于只有在/当它们发生突变时才真正被复制?
字符串和序列之间是否有任何显着差异,或者上述问题的答案是否可以同样适用于所有序列?
一般还有什么值得注意的吗?
谢谢!
for-loop - Nim:如何迭代切片?
我对以下观察感到困惑。一方面,这有效:
但是一旦我将切片存储在一个变量中,我就不能再对其进行迭代,即,这会失败:
错误是type mismatch: got (Slice[system.int])
,显然没有system.items
迭代器的重载签名Slice[T]
。这就提出了以下问题:
- 为什么它在第一种情况下完全有效?
- 在第二种情况下是否有一种解决方法来遍历切片?
operator-overloading - Nim 运算符重载
刚开始用 Nim 语言编程(到目前为止我真的很喜欢)。作为学习练习,我正在编写一个小型矩阵库。我还有一堆代码,但我只会展示与这个问题相关的部分。
所有这一切都很好,但我希望能够用类似的东西替换最后一行
这行不通(没想到也行)。如果我尝试,我会得到
我将如何创建具有此行为的加法赋值运算符?我猜我需要一个程序以外的东西来完成这个。
functional-programming - 在 nim 中传递函数
我在 Nim(版本 0.10.2)中传递数学函数(procs)时遇到问题。
我得到错误
如果我为 sqrt 编写一个包装函数,它工作得很好。
我使用平方根和映射作为示例,但最终我会将 sqrt(和其他数学过程)传递给另一个过程。有没有办法在不编写包装函数的情况下做到这一点?
path - Nim(rod) 没有正确安装到路径?
我正在按照将Nim (rod) 安装到 linux 上的说明进行操作。然后我按照这个网站显示这样做:
在终端中输入nim
不会做任何事情。
我的主目录中有一个 Nim 文件夹,其中包含所有文件,但无法使用它。
我做了回声
export PATH=$PATH:$/home/bob/Nim/bin' >> ~/.profile
而 nim 命令仍然什么都不做。我做的不对吗?当我在 Nim 文件夹中时
,命令 pwd 告诉我。/home/bob/Nim
我尝试在 Nim/bin 中使用 sh 运行 nim 并做到了./nim -path:/home/bob/Nim/bin
它说:
config/nim.cfg(45, 2) 提示:添加路径:'/home/bob/.babel/pkgs/' [路径] config/nim.cfg(46, 2) 提示:添加路径:'/home/bob /.nimble/pkgs/' [路径] 提示:使用的配置文件 '/home/bob/Nim/config/nim.cfg' [Conf]
nim-lang - 如何更改 Nim 编译器输出文件的位置和名称
编译 Nim 程序nim c -r example.nim
会创建输出文件example
。我想在另一个文件夹中创建一个输出文件,其名称bin/example.o
更容易 gitignore。
到目前为止我已经尝试过:
所有这些尝试的结果与我忽略该-o/--out
选项的结果相同,从而导致可执行example
文件与该文件位于同一文件夹中example.nim
。如果我不传入选项,编译器甚至不接受该-r
选项(这让我认为我误解了该选项的目的)。
我正在使用从 githubdevel
分支源安装和编译的 Nim 0.10.3。
什么编译器选项将允许我修改编译的输出文件?
c++ - 在 nim 中包装嵌套的模板类型
我有一个 C++ 类型,如:
在 C++ 中,我可以使用Iterator
as Vector<int>::Iterator
。
我如何包装它以从 Nim 使用它?c2nim 发出
它不会编译,因为 nim 没有嵌套类型,并且会生成Vector<T>::Iterator<T>
而不是Vector<T>::Iterator
.
我可以在 Nim 中使用非嵌套类型:
这自然会产生Vector::Iterator<int>
,这是错误的(应该是Vector<int>::Iterator
)。
有没有办法改变导入规范以产生正确的输出?