标签: language-implementation

为什么Python列表添加必须是同质的?

任何熟悉Python内部(CPython或其他实现)的人都可以解释为什么列表添加需要是同质的:

In [1]: x = [1]

In [2]: x+"foo"
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
C:\Users\Marcin\<ipython-input-2-94cd84126ddc> in <module>()
----> 1 x+"foo"

TypeError: can only concatenate list (not "str") to list

In [3]: x+="foo"

In [4]: x
Out[4]: [1, 'f', 'o', 'o']
Run Code Online (Sandbox Code Playgroud)

为什么x+"foo"以上不会返回与x上述成绩单中的最终值相同的值?

这个问题来自NPE的问题:Python列表+ = iterable的行为是否记录在何处?

更新:我知道不需要异质+=工作(但确实如此),同样,并不要求异质+是错误.这个问题是为什么做出后一种选择.

很难说将序列添加到列表中的结果是不确定的.如果这是一个充分的反对意见,那么防止异质性是有意义的+=.Update2:特别是,python总是将操作符调用委托给左侧操作数,因此没有问题出现"什么是正确的事情"":左手对象总是管理(除非它委托到右边).

更新3:对于任何人认为这是一个设计决定,请解释(a)为什么没有记录; 或(b)如有文件记录.

Update4:"应该[1] + (2, )返回什么?" 它应该返回一个结果值,该值等于x最初[1]紧跟在之后的变量的值x+=(2, ).这个结果定义明确.

python language-design language-implementation python-internals

24
推荐指数
2
解决办法
817
查看次数

如何在C#中实现foreach?

究竟是如何foreach在C#中实现的?

我想它的一部分看起来像:

var enumerator = TInput.GetEnumerator();
while(enumerator.MoveNext())
{
  // do some stuff here
}
Run Code Online (Sandbox Code Playgroud)

但是我不确定究竟发生了什么.enumerator.Current每个周期使用什么方法返回?它是为[每个循环]返回还是需要匿名函数或其他东西才能执行foreach

c# foreach language-implementation language-specifications

22
推荐指数
2
解决办法
8753
查看次数

C++的多重继承是如何实现的?

单继承很容易实现.例如,在C中,继承可以模拟为:

struct Base { int a; }
struct Descendant { Base parent; int b; }
Run Code Online (Sandbox Code Playgroud)

但是对于多重继承,编译器必须在新构造的类中安排多个父类.怎么做?

我看到的问题是:父母应该安排在AB或BA中,还是以其他方式安排?然后,如果我做演员:

SecondBase * base = (SecondBase *) &object_with_base1_and_base2_parents;
Run Code Online (Sandbox Code Playgroud)

编译器必须考虑是否更改原始指针.虚拟化需要类似的棘手的事情.

c++ compiler-construction inheritance language-implementation multiple-inheritance

21
推荐指数
3
解决办法
6966
查看次数

Haskell编译器如何工作?

我在哪里可以得到一些论文/ doc /描述Haskell编译器实际工作方式的内容?我阅读了很多GHC的文档,但在头痛之后就停止了.因此,不需要博士学位来理解它并且不是用你应该已经熟悉的那种方式写的东西会更好.如果它真的很长并且需要一些时间来理解它,这不是问题.

PS:最有趣的是关于GHC,但一切都很好.

compiler-construction haskell language-implementation

21
推荐指数
3
解决办法
4103
查看次数

Lisp在解析方面更好吗?

我想用Lisp方言实现一个Lisp解释器,主要是作为一种学习练习.我被抛弃的一件事就是这个领域有多少选择.首先,我对学习一段时间内的一些Lisps(如Scheme或Common Lisp)更感兴趣.我不想使用Clojure为我已经使用它的纯粹事实这样做.:-)

在解析时,其中一种口味比其他口味更好吗?你认为在Common Lisp中实现Scheme是一个好主意(反之亦然)?或者两者之间是否会有足够的差异让我失望?

如果它有所不同,我想要一些跨平台的东西.我有一台Windows PC,一台Mac机和一个Linux机箱,我最终可以在其中任何一个上写这个.

lisp scheme parsing language-implementation common-lisp

20
推荐指数
1
解决办法
1377
查看次数

java.util.HashMap和HashSet的内部实现

我一直在试图了解内部实现的java.util.HashMapjava.util.HashSet.

以下是我脑海中浮现的疑惑:

  1. 什么是@Override public int hashcode()HashMap/HashSet中的重要性?这个哈希码在内部使用在哪里?
  2. 我一般都看到HashMap的关键是String这样的myMap<String,Object>.我可以映射值someObject(而不是字符串)myMap<someObject, Object>吗?我需要遵守的所有合同成功发生了什么?

提前致谢 !

编辑:

  1. 我们是说密钥的哈希码(check!)是在哈希表中映射值的实际内容吗?当我们执行myMap.get(someKey);java时,内部调用someKey.hashCode()以获取哈希表中的数字以查找结果值?

答:是的.

编辑2:

  1. 在a中java.util.HashSet,从哪里为Hash表生成密钥?它来自我们正在添加的对象,例如.mySet.add(myObject);然后myObject.hashCode()将决定它在哈希表中的位置?(因为我们不在HashSet中给出键).

答:添加的对象成为关键.价值是假的!

java language-implementation hashmap hashcode hashset

18
推荐指数
4
解决办法
5万
查看次数

如何在C中实现C++虚函数

C++语言提供了virtual函数.在纯C语言实现的约束下,如何实现类似的效果?

c c++ language-implementation

18
推荐指数
1
解决办法
1万
查看次数

如何在Perl中实现数组?

Perl数组是一种抽象数据类型.Perl数组的内部机制是什么?它是用动态数组还是链表实现的?由于数组元素具有随机访问权限,因此我假设一个动态的指针数组,或者对标量的引用是有意义的.但是,对于数组头部的移位和非移位操作,数组是否必须通过这些操作移动其所有元素?听起来对我来说效率低下.任何想法?

perl language-implementation data-structures

17
推荐指数
2
解决办法
1925
查看次数

为什么绑定会影响我的地图类型?

我在REPL中玩耍,我有一些奇怪的行为:

Clojure 1.4.0
user=> (type {:a 1})
clojure.lang.PersistentArrayMap
user=> (def x {:a 1})
#'user/x
user=> (type x)
clojure.lang.PersistentHashMap
Run Code Online (Sandbox Code Playgroud)

我认为所有小的文字地图都是实例PersistentArrayMap,但显然情况并非如此def.为什么要使用defClojure为我的litte地图选择不同的表示?我知道这可能只是一些奇怪的实现细节,但我很好奇.

language-implementation clojure map

16
推荐指数
1
解决办法
330
查看次数

编译语言中的垃圾收集实现

在实现精确的垃圾收集时,总是存在弄清堆栈上哪些字是指针以及哪些是其他类型的数据(如整数或浮点数)的问题.解释语言通常通过使所有东西成为指针来解决这个问题; 某些语言(如Lisp)的编译器通常使用标记位来区分指针和整数来解决它.

但是Java和C#等语言的JIT编译器如何支持完整的无盒装机器字整数和浮点数?他们如何判断堆栈和CPU寄存器的哪些内容是指针?

compiler-construction garbage-collection language-implementation

14
推荐指数
1
解决办法
1391
查看次数