见标题.我想从Anaconda存储库下载一个压缩包,以便以后安装.我如何使用conda工具来做到这一点?
我正在研究使用LLVM作为本机代码生成器来设计支持轻量级进程("绿色线程")的并发语言.轻量级进程以M:N方式分配给本机OS线程,并且线程之间的工作窃取应该是可能的(即,进程应该由可以在线程之间传递的数据结构表示,如果需要).可能同时存在大量进程,因此进程不应占用大量内存,并且它们之间的上下文切换应尽可能快.此外,在上下文切换期间或者如果发生垃圾收集,"暂停"轻量级进程应该相当简单.我知道Erlang有一个LLVM后端,但我发现很少有关于它的实现的文献;
programming-languages llvm lightweight-processes green-threads
通常,除了提供函数声明之外,C标准头文件还可以提供"屏蔽宏"以使事情更快.例如,如果我包含ctype.h,则头文件将声明
int isdigit(int c);
Run Code Online (Sandbox Code Playgroud)
但它也可能用宏来掩盖声明.我相信这是一个isdigit符合C标准的便携式宏:
#define isdigit(c) ((c) >= '0' && (c) <= '9')
Run Code Online (Sandbox Code Playgroud)
当然,这个宏也很危险,因为如果在定义宏时执行此操作会引入未定义的行为:
int c = 'A';
printf("%d\n", isdigit(c++));
Run Code Online (Sandbox Code Playgroud)
为了避免UB在这个假设的情况下,我必须用parens包围函数名: (isdigit)(c++).所以,我的问题是:标准头可以定义哪种屏蔽宏有什么限制吗?如果参数表达式具有副作用,或者它们在技术上是否允许具有奇怪的行为(例如我们在上面看到),它们是否保证不会导致未定义的行为?限制在哪里?
这个问题的答案说,Erlang PID实际上是28位整数,其中前10个是节点号(本地节点始终为0),其后18个是全局过程表的索引。因此,如果我的理解是正确的,那么假设我们仅在单个节点上工作,则唯一pid的最大数量为2 ^ 18,即大约262,000。这是否是我可以随时间在单个Erlang节点上产生的最大进程数?如果我有一个运行时间很长的Erlang节点,分配我的第2 ^ 18 + 1个节点后,VM会立即崩溃吗?还是可以重用旧的未使用的pid?如果是这样,该过程如何在虚拟机级别实施?
许多编程语言都有以行结尾终止的语句。但是,通常情况下,如果解析器无法理解该行,则在语句中间允许行结尾;例如,
a = 3 +
4
Run Code Online (Sandbox Code Playgroud)
...将在 Ruby 和 Python* 中解析为 statement a = 3+4,因为a = 3+没有任何意义。换句话说,换行符会被忽略,因为它会导致解析错误。
我的问题是:如何使用标记器和解析器简单/优雅地完成相同的行为?我使用 Lemon 作为解析器生成器,如果它有任何不同的话(尽管我也将这个问题标记为 yacc,因为我确定该解决方案同样适用于两个程序)。
这是我现在的做法:在没有句法歧义的任何情况下,允许可选地出现语句终止符。换句话说,像
expression ::= identifier PLUS identifier statement_terminator.
expression ::= identifier PLUS statement_terminator identifier statement_terminator.
Run Code Online (Sandbox Code Playgroud)
...换句话说,可以在加号后使用换行符,因为这不会对语法的歧义产生任何影响。我担心这会增加语法的大小,我有很多机会遗漏案例或在语法中引入细微的错误。有没有更简单的方法来做到这一点?
编辑*:实际上,该代码示例不适用于 Python。但是,如果您传入这样的内容,Python 实际上会忽略换行符:
print (1, 2,
3)
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一些C代码移植到C++,而数组声明(或者更确切地说,一系列数组声明)给我带来了问题.代码的组织方式如下:首先,声明一个全局数组,如下所示:
static const Foo foos[100];
Run Code Online (Sandbox Code Playgroud)
然后,声明并初始化了一堆其他数组,所有这些数组都引用了foos数组的某些元素,如下所示:
static const Bar bar1[3] = { .... &foos[3]; .... }
Run Code Online (Sandbox Code Playgroud)
最后,重新声明并初始化原始数组.数组的元素引用了我们刚刚声明的一堆数组(换句话说,结构是相互递归的):
static const Foo foos[100] = { .... &bar1[1]; .... }
Run Code Online (Sandbox Code Playgroud)
在C中,这很好.第一个声明只是说"嘿,我以后需要一个100 Foo的数组",然后第二个声明实际上告诉编译器我们想用数据填充数据.因为我正在处理的结构是相互递归的,所以这一切都非常好.
但是,C++给了我重新声明的真正问题.我不是一个真正的C++程序员,但我相信这一切都与C++关于默认初始化的规则有关.
所以这是我的问题: 如何在C++中捕获上述模型?如何在不实际初始化内容的情况下预先声明数组的类型和大小?
(不要打扰告诉我这是一个糟糕的设计 - 我实际上是在编写一个针对C的编译器,所以计算机生成的C代码的设计是好还是坏都无关紧要.我只想知道如何在C++中预先声明结构数组.)