问题标签 [language-implementation]
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.
lisp - 允许将特殊形式视为正常值会产生什么后果?
我发现在 Clojure 中,特殊形式不能作为参数传递或保存在变量中:
在球拍/方案中:
这很酷,我很好,我知道我可以编写一个函数来包装一个特殊的表单,然后传递那个函数。
但我想知道为什么 Lisps 有这个限制,以及允许这样做会产生什么负面影响。他们是否有任何允许这样做的主要方言?
map - 为什么绑定会影响我的地图类型?
我在 REPL 中玩耍时遇到了一些奇怪的行为:
我认为所有小的文字映射都是 的实例PersistentArrayMap
,但如果它与 . 绑定,显然情况并非如此def
。为什么 usingdef
会导致 Clojure 为我的小地图选择不同的表示形式?我知道这可能只是一些奇怪的实现细节,但我很好奇。
functional-programming - 用纯函数式语言实现 Prolog
我将非常感谢用于实现 Prolog 的简单伪代码算法,其中伪代码被视为纯函数式语言。
python - 为什么 Python 列表加法必须是同质的?
任何熟悉 Python 内部结构(CPython 或其他实现)的人都可以解释为什么列表添加必须是同质的:
为什么上述内容不应该返回与上述成绩单中x+"foo"
的最终值相同的值?x
这个问题来自 NPE 的问题:Python's list += iterable 的行为是否记录在任何地方?
更新:我知道不需要异构+=
工作(但确实如此),同样,不需要异构工作+
是错误的。这个问题是关于为什么做出后一种选择。
说将序列添加到列表中的结果是不确定的,这太过分了。如果这是一个充分的反对意见,那么防止异质+=
. 更新 2:特别是,python 总是将运算符调用委托给左侧操作数,因此不会出现“什么是正确的事情”的问题:左侧对象总是管理(除非它委托给右侧)。
更新 3:对于任何争论这是一个设计决定的人,请解释 (a) 为什么它没有记录在案;(b) 记录在案的地方。
Update4:“应该[1] + (2, )
返回什么?” 它应该返回一个结果值,该值等于x
最初保持[1]
在 之后的变量的值x+=(2, )
。这个结果是明确定义的。
c# - ArrayList 内部实现
希望这不是重复的。
在任何事情之前,我知道 ArrayList 不是最好的选择,但这只是好奇。
简单地说,我想知道 ArrayList 的实现。我查看并发现它使用数组进行存储。
对于数组,当你有:
arr 指向数组的第一个元素,因为它是整数类型,编译器知道跳转到哪里:
现在,由于 ArrayList 是无类型的,我想知道编译器如何确定下一项在哪里。我猜想有一个开销告诉数据是什么,以便编译器可以执行指针算术。
因此,ArrayList 应该比任何其他类型化集合慢得多,因为它不能只跳转到数据,因为它需要知道之前的内容。这与 LinkedList 非常相似。
functional-programming - 如何实现函数式语言
我正在尝试学习命令式语言和函数式语言之间的区别。
而且,我想了解闭包以及垃圾收集器是如何实现的。所以我决定尝试为函数式语言实现解释器。
由于我不熟悉函数式语言,因此设计一种对我来说太难了。是否有一些关于简单函数式语言的语法和语义的资源?有关如何执行此操作的教程将非常有帮助。
ruby - 为什么 __FILE__ 大写而 __dir__ 小写?
在 Ruby 2.0.0-p0 中,__dir__
引入了该变量以便于访问当前正在执行的文件的目录。
为什么大写是__dir__
小写__FILE__
?
c# - System.String 如何保存它的字符串
为了在 .NET 上做得更好,我发现了解 .Net-Framework 本身以及 Microsoft 如何实现所有美好的东西很有帮助。上次我使用我的反编译器查看 的实现System.String-Class
,研究 String-Object 如何存储其实际字符串。我对 self 中最大的类感到惊讶,并且我无法清楚地确定实际字符串保存的类的哪一部分。
这是反编译的两个屏幕截图,显示了类的开始和结束部分:
我想[System.Reflection.DefaultMember("Chars")]
(第一个屏幕截图的第一行)和/或属性public extern char this[int index]
(第二个屏幕截图的中间)是我正在寻找的。
这是正确的,如果是的话,它是如何工作的?
c++ - 通过 C/C++ 编译和编译器错误/限制
我正在研究通过 C 编译实现高级(类 Lisp)语言的可能性(或者如果异常证明足够有用,则可能是 C++);这是许多项目以前使用的策略。当然,这将生成 C 代码,这与您手工编写的任何内容不同,并且可能在某些方面超出了复杂性。
现代 C 编译器在正常使用中非常可靠,但很难知道在异常压力下的边缘情况下可能潜伏着哪些错误,特别是如果你超过了一些“没有程序员会写出大于 Y 的 X”的隐藏限制。
我突然想到,这些事实的巧合可能会导致不快乐。
是否有任何已知的案例,或者是否有一种很好的方法可以找到在合理的最新版本的主要编译器(例如 GCC、Microsoft C++、Clang)中生成的代码超出边缘案例错误/限制的案例?