问题标签 [dynamic-typing]

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.

0 投票
6 回答
154933 浏览

python - 如何识别python中的numpy类型?

如何可靠地确定对象是否具有 numpy 类型?

我意识到这个问题违背了鸭子类型的哲学,但想法是确保一个函数(使用 scipy 和 numpy)永远不会返回一个 numpy 类型,除非它被一个 numpy 类型调用。 这出现在另一个问题的解决方案中,但我认为确定对象是否具有 numpy 类型的一般问题与应该将它们分开的原始问题相距甚远。

0 投票
1 回答
164 浏览

javascript - 关于 Javascript 变量类型预测的资源?

引用这篇学术论文:动态语言中的句法和语义预测

IntelliSense 实际上是基于变量类型的知识。因此,描述变量的符号必须包含它们的类型,如果它是已知的并且可以解析的话。此外,在动态语言中,一个变量可以在代码的不同部分和不同的程序执行中携带不同的类型实例。变量也可以动态启动,其类型只能在运行时知道。因此,符号应该包含一些在语义分析中解析的可能类型列表。但总的来说,动态语言无法明确解决即使是单个程序执行也无济于事。

我在哪里可以找到更多这方面的资源,我特别感兴趣的是上面引用中强调的陈述,最后是一些关于代码静态分析预测率的统计数据。

0 投票
3 回答
663 浏览

c++ - 在 C++ 中的向量/数组中存储不同类型的元素?

我正在尝试用 C++ 创建一个简单的动态语言解释器。我希望能够声明动态类型的数组,但我不确定如何将它们存储在 C++ 中的某个对象中。

在 Ruby/Python 中,我可以存储任何我想要的东西,但是在 C++ 中这样做的有效方法是什么?

(另外,如果有人有一个简单的开源词法分析器/解析器/解释器的链接,用于像 Ruby 这样的动态语言,我会很感激一个链接)。

0 投票
2 回答
1249 浏览

haskell - 这是对 unsafeCoerce 的安全使用吗?

我有一种情况,我目前正在使用极其可怕的功能 unsafeCoerce。幸运的是,这不是什么重要的事情,但我想知道这是否是对这个函数的安全使用,或者是否会有另一种方法来解决其他人知道的这个特定问题。

我拥有的代码如下所示:

需要注意的另外两件事是,这些标记在一个 monad 中使用,我使用它来确保为它们提供的整数是唯一的(即我不会两次制作相同的标记)。我还使用了一个 forall 量化的影子类型变量,与 ST monad 一样,以确保(假设仅使用我在模块中公开的方法)没有办法返回令牌(或者实际上什至是F) 来自 monad,而不是类型错误。我也没有公开令牌构造函数。

我认为,据我所见,这应该是 unsafeCoerce 的安全用法,正如我可以说(我希望)非常自信地说,我强制的值实际上正是我强制它的类型,但我可能错了。我也尝试过使用 Data.Typeable,它工作得很好,但目前我正在尝试这样做以避免 Typeable 约束,特别是因为 gcast 似乎在许多方面做了类似的事情,而且我仍然需要令牌来区分同类型的不同F。

非常感谢任何帮助/建议。

0 投票
2 回答
4346 浏览

objective-c - 如何在运行时检查特定属性及其返回类型?

由于名为“age”的属性也总是有一个名为“age”的选择器,我可以respondsToSelector按照这个问题的建议使用它,这将告诉我在运行时是否存在任何给定对象中的特定选择器。

如果存在名为“age”的属性,我可以验证这一点。我怎么知道该选择器(该属性的读取方法)是返回对象(id)还是非对象(int)?

这种类型确定是否可以在运行时进行,还是 Objective-C 方法总是假设有人使用我希望它使用的类型实现了该方法,或者我也可以验证返回类型?

这是在 XCode 4.5 中使用最新的 Objective-C 版本(LLVM 4.1)。

更新:这是我想出的实用程序类别 NSObject:

在研究这个问题时,我还编写了这个方便实用的实用方法,可以列出该对象的所有属性:

0 投票
1 回答
176 浏览

c++ - 如何添加不同类型的属性图?

这是一个 C++(11) 设计问题:

假设我想创建一个图形数据结构,您可以在其中将节点/边映射到任意属性。(它是一个图表并不真正相关,它可能是具有属性的元素的任何容器,但这是我的示例。)

使用这样的数据结构,我可以为所有节点动态添加一个新属性:

...然后将其设置为节点:

...并删除该属性以节省内存:

G.addNodeMap获取地图的标识符(可能是字符串)和条目的默认值。使用 C++11,T“节点映射”的类型可以方便地从给定的默认参数中推断出来。节点映射本身可能是 a std::vector<T>,因为节点只是一个索引。

问题:我在哪里存储向量std::vector<std::string> map1, std::vector<std::double> map2, std::vector<Foo> map3.... ?

动态类型语言不会出现此问题。如何用 C++ 实现这种行为?

0 投票
2 回答
168 浏览

c++ - 这可以通过静态类型来完成吗?

此方法尝试std::vector<?>根据键 ( ) 选择 ( std::string),其中?intfloat

该类的相关成员是:

这将无法编译,因为auto nodeMap(= std::vector<?>) 未初始化。但是为了初始化它,我必须在编译时知道它的类型。

也许我正在尝试的事情不能用静态类型来完成。有没有 C++ 方法来完成这个?

0 投票
2 回答
190 浏览

haskell - Haskell - 使用高级类型功能帮助简化功能

我正在为 Haskell 中的动态类型语言编写解释器。

像大多数动态类型的语言解释器一样,我的程序也需要在运行时检查类型。我的程序中最常用的代码之一是:

在这里我确保它p有 type TString,然后我用VStr s <- .... 这永远不会失败,因为VStr它是唯一具有 type 的值TString

我的数据结构基本上是这样的:

所以我根据它们的类型来区分我的值。IE。我只有一个具有TStras 类型的值构造函数。

现在我想知道是否有办法简化我的ensureType函数和解构代码。例如,这样的事情是否可能:

这里从后面的代码s <-可以推导出它s有类型String,并且静态知道只有Value构造函数有一个String部分VStr,所以动态检查是否是a后ensureType返回。StringpVStr

我实际上不知道这是否有意义或可能。我只是想借助 Haskell 的高级类型系统功能来改进我的设计。

任何帮助将不胜感激。

0 投票
1 回答
711 浏览

heap-memory - 我可以说在具有动态类型绑定的语言中,所有变量都分配在堆上吗?

我正在研究基于存储绑定的绑定过程和变量分类。所以,我面临四种变量:

  1. 静态变量:它们在执行之前(即编译期间)绑定到内存,并在整个执行过程中保持绑定。
  2. 堆栈动态变量:这些变量在编译时静态绑定到类型,但在代码执行到达声明之前它们不会绑定到内存位置。
  3. 显式堆动态变量:这些变量通过显式运行时、程序员指定的指令分配和释放。堆而不是堆栈用于提供所需的存储单元。
  4. 隐式堆动态变量:这些变量的所有属性,包括内存单元,在被赋值时都是绑定的。

我的问题是关于类型 2 和 4。在类型绑定是动态的编程语言中(Php、Ruby、Python,...),所有变量似乎都是类型 4。

这是真的吗?所有变量甚至局部变量都放在堆上?这是实现的事情还是不可能实现具有动态类型绑定的语言,其局部变量放在堆栈中而其他变量放在堆中?

0 投票
3 回答
3301 浏览

c++ - C++ 在多大程度上是一种静态类型语言?

我曾经认为这个问题的答案是“ 100% ”,但最近有人指出了一个值得三思的例子。考虑一个声明为具有自动存储持续时间的对象的 C 数组:

这里的类型foo很明显int[42]。相反,考虑这种情况:

这里的类型fooint*,但是如何知道在编译时由表达式创建的对象的类型呢?new(强调是为了强调我不是在谈论表达式返回的指针new,而是谈论由表达式创建的数组对象new)。

这是 C++11 标准的第 5.3.4/1 段对new表达式结果的规定:

[...] 由new-expression创建的实体具有动态存储持续时间 (3.7.4)。[注意:此类实体的生命周期不一定限于创建它的范围。—尾注] 如果实体是非数组对象,则new 表达式返回指向所创建对象的指针。如果它是一个数组,则new 表达式 返回一个指向数组初始元素的指针。

我曾经认为在 C++ 中,所有对象的类型都是在编译时确定的,但上面的例子似乎反驳了这种看法。此外,根据第 1.8/1 段:

[...] 对象的属性是在创建对象时确定的。一个对象可以有一个名称(第 3 条)。对象具有影响其生命周期 (3.8) 的存储持续时间 (3.7)。一个对象有一个类型(3.9)。[...]

所以我的问题是:

  1. 最后引用的段落中的“属性”是什么意思?显然,一个对象的名称不能算作“在创建对象时”确定的东西——除非“创建”在这里的意思与我想的不同;
  2. 是否还有其他类型仅在运行时确定的对象示例?
  3. 说 C++ 是一种静态类型的语言在多大程度上是正确的?或者更确切地说,在这方面对 C++ 进行分类的最恰当方法是什么?

如果有人可以至少详细说明上述几点,那就太好了。

编辑:

该标准似乎清楚地表明该new表达式确实创建了一个数组对象,而不仅仅是一些人指出的以数组形式排列的几个对象。根据第 5.3.4/5 段(由Xeo提供):

当分配的对象是一个数组(即使用noptr-new-declarator语法或new-type-idtype-id表示数组类型)时,new-expression 产生一个指向初始元素的指针(如果任何)的数组。[注意:两者都new int具有new int[10]类型int*,并且类型new int[i][10]int (*)[10] --end note] noptr-new-declarator中的属性说明符序列属于关联的数组类型