如果允许全局变量,纯函数式语言是否会失去其纯度?我的意思是全局变量是否会影响语言的引用透明度?
我想不是,因为价值语义,但我不确定,并想知道其他人的想法.
我有兴趣学习如何编写像flex这样的词法生成器.我一直在阅读"编译器:原理,技术和工具"("龙书"),我对flex的工作原理有一个基本的了解.
我最初的方法是:用户将提供正则表达式的哈希映射,将正则表达式映射到令牌枚举.程序将按照给定的顺序逐个遍历正则表达式,看看它们是否与字符串的开头匹配(我可以^
在每个正则表达式的开头添加一个来实现它).如果他们这样做,我可以将该正则表达式的令牌添加到该程序的令牌列表中.
我的第一个问题是,这是最有效的方法吗?目前我必须遍历每个正则表达式,但理论上我可以从所有正则表达式组合构建DFA并更有效地逐步执行.但是,创建此DFA会产生一些开销.
我的第二个问题是,我如何实现最长的匹配字符串连接断路器,就像flex一样?即,我想匹配ifa
作为标识符,而不是if
字母后跟的关键字a
.我没有看到任何有效的方法来使用正则表达式.我想我必须循环遍历所有正则表达式,尝试匹配它们,如果我有多个匹配项,则取最长的结果.但是,如果我将正则表达式转换为DFA(即我自己的DFA数据结构),那么我可以继续单步执行字符,直到DFA上没有可能的过渡边缘.此时,我可以将最后一次通过接受状态作为令牌的实际匹配,因为这应该是最长的匹配.
我的两个问题都指向将自己的翻译从正则表达式编写为DFA.这是必需的,还是我仍然可以使用普通正则表达式(由标准库实现)有效地执行此操作并仍然获得最长的匹配?
编辑:我保留了我正在使用的正则表达式引擎,因为我想要一个通用的答案,但我正在使用Rust的正则表达式库:http://static.rust-lang.org/doc/master/regex/index. HTML
regex language-agnostic programming-languages lexical-analysis dfa
我对Java或编程很新.在我通过互联网来掌握这种语言的旅程中,我提出了"多次在任何地方运行"的说法.
但我发现许多软件要求您为您的操作系统选择合适的版本.有时只有一个版本可用.
你能解释一下为什么会这样吗?
VHDL图灵是否完整?我的理解是VHDL创建了一个寄存器机器,并且注册机器 - 没有任意RAM - 不是图灵完整的.
这准确吗?对于在寄存器机器中无法解决的问题,是否有标准方法 - 使用VHDL外部的RAM,并通过VHDL管理它?
我喜欢Xcode作为IDE.我想扩展我的编程知识以包含多种语言,并且想知道Xcode 6中支持哪些语言.显然,Swift,Objective-C,C和C++可以在Xcode中运行.但是有没有可以与Xcode一起使用的所有语言的列表?
我一直在研究疯狂,我很惊讶地看到这个问题还没有问过十亿次.有很多特定的代码,"我可以在Xcode中编写Perl"类型的问题,但我还没有找到我可以使用Xcode作为我的IDE编写的所有语言的列表.
我不确定我是否正确地问这个问题,如果我不是,请指出我正确的Stack Exchange网站.
名为"Everything"的NTFS文件系统搜索引擎可以从http://www.voidtools.com/下载 ,因为它表现得很好,我很好奇它编写的编程语言.
我搜索了上述网站的论坛和谷歌没有成功..我明白该应用程序是专有免费软件,所以我将无法获得源代码.但是,我从来没有听说过任何应用程序,其中隐藏了有关其所用语言的信息.
所以我的问题是:什么语言是'一切'写的?
我是C的初学者.我最近了解了2's Complement
以及其他表示负数的方法,以及为什么2's complement
最合适的方法.
我想问的是,例如,
int a = -3;
unsigned int b = -3; //This is the interesting Part.
Run Code Online (Sandbox Code Playgroud)
现在,用于转换int类型
标准说:
6.3.1.3有符号和无符号整数
当具有整数类型的值转换为除_Bool之外的另一个整数类型时,如果该值可以由新类型表示,则它将保持不变.
否则,如果新类型是无符号的,则通过重复地添加或减去一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内.
第一段不能用作-3
无法表示的段落unsigned int
.
因此第2段开始发挥作用,我们需要知道unsigned int的最大值.它可以在limits.h中找到UINT_MAX.在这种情况下的最大值是这样的计算是:4294967295
-3 + UINT_MAX + 1 = -3 + 4294967295 + 1 = 4294967293
Run Code Online (Sandbox Code Playgroud)
现在4294967293
二进制是11111111 11111111 11111111 11111101
并且-3
在2的补码形式中11111111 11111111 11111111 11111101
它们基本上是相同的位表示,无论我试图分配给无符号整数的负整数,它总是相同的.所以不是无符号类型冗余.
现在我知道printf("%d" , b)
根据标准,这是一种未定义的行为,但这不是一种合理且更直观的做事方式.如果否定被表示为2's Complement
现在,那么代表将是相同的,并且使用的其他方式很少,并且很可能不会在未来的发展中.
因此,如果我们只有一个类型说int,int x = …
c programming-languages language-concepts twos-complement unsigned-integer
编1:
#include<stdio.h>
int main()
{
int i=0;
while(i<=8,i++);
printf("%d",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编2:
#include<stdio.h>
int main()
{
int i=0;
while(i++,i<=8);
printf("%d",i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Prog 1的输出为1,而Prog 2的输出为9。
有人可以解释一下这里发生了什么。两种代码有何不同?
为什么只有C++(和D语言)出于支持可变参数模板的许多编程语言?
为该语言提供此功能是否有巨大的好处?
或者底层的复杂性和编译时间的增加(由于类型检查)使得它不值得努力?
我在哪里知道只有C++(和D语言)支持可变参数模板?
c++ templates programming-languages variadic-templates c++11
我正在阅读关于C++的教程,并且出现了以下内容.没有提供其他细节进一步解释
C++是一种"语言联盟",支持多范式编程,我们有很多选择.
当C++被称为语言联合以及什么是多范式编程时,它意味着什么?