问题标签 [dynamic-languages]
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.
python - 如何创建具有属性的内联对象?
在 Javascript 中,它将是:
但是 Python 中的相同语法会创建一个字典,这不是我想要的
c# - 如何判断一种语言是否是“动态语言”?
我试图更好地理解语言“动态”的真正含义。我对Lingo有相当多的经验,它是 Adobe(以前的 Macromedia)Director 产品线的脚本语言,我只是想知道它是否会被视为“动态语言”。
处理变量和列表的方式对我来说似乎非常“动态语言”。
使用变量,您只需编写foo = 3
or bar = "Hello World"
。您没有将变量声明为 anint
或string
--it 按原样计算。
使用列表,您可以编写类似miscCollection = [3, "Hello World", #helloWorld, ["Embedded List", "Goes Here", 3], [#phrase: "Property List goes here", #value: 3]]
. 这不类似于 atuple
吗?
这些功能是否足以符合“动态语言”状态?
有趣的是,我使用 C# 的次数更多,而使用 Director/Lingo 的次数更少,但是这些天对动态语言的兴奋之情,我想知道我是否真的违背了规律。
编辑
关于 Mark Rushakoff 的回答,下面是使用此Wikipedia 文章分析 Lingo 是否符合“动态”条件的尝试:
Eval
- 行话有do
和value
关键字。do
将执行整个命令,例如,do "foo = 23"
或do "foo = sum(20, 3)"
。value
尝试将字符串转换为数字,但它不仅仅是一个解析运算符——它实际上可以将一个变量的字符串表示形式转换为它的数字,例如,假设foo = 23
,该语句value("foo")
将计算为 23。高阶函数——如果我理解正确的话,这基本上就是我在 C# 中被称为“代表”的东西。据我所知,Lingo 不直接支持这一点,尽管您可以创建一个具有函数的类型(称为“父脚本”)并传递该类型的实例。
闭包 - 据我所知,不支持这个。
继续——据我所知,不支持这个。
反思——至少在某种意义上,是的。您实际上是使用字符串创建类型的新实例,例如
fooInstance = script("Foo").new(bar)
. 也可以将类型的实例转换为包含类型名称的字符串(这样您就可以模仿 c# 的GetType()
功能)。您还可以在不知道属性名称的情况下查询类型的属性(例如,通过索引查找属性)并通过索引找出属性的名称。宏 - 维基百科文章描述宏的方式,我不这么认为。但是,可以在运行时编辑脚本,所以这可能很重要。
所以,看起来 Lingo 在动态特性上得分 2 到 3(满分 6 分),但我对闭包和延续还不够清楚,无法确定 Lingo 不支持它们。我想我不确定要得出什么结论。欢迎评论。
dynamic-languages - 为什么动态语言的“动态”部分这么好?
Jon Skeet 发布了这篇博文,其中他说他将要问为什么语言的动态部分如此出色。所以我想我会代表他先发制人地问:是什么让他们这么好?
domain-driven-design - 动态语言中的领域驱动设计工作?
您知道动态语言中的任何 DDD 工作吗?
当偏离面向企业的解决方案时,DDD 上的实用资源往往会急剧减少(排除 C#、.NET、ASP 和 Java 的谷歌搜索产生的结果要少 10 倍),但我实际上找不到 DDD 实现的单个示例用动态语言...
compiler-construction - 动态语言与静态语言(这两者可以放在同一个地方吗)
编程语言分为两大类“动态”和“静态”。- 编程语言是否总是存在于其中一个而不是两者中,我的意思是一种语言可以同时是动态的和静态的吗?
specifications - 用超出规范允许范围的动态语言编写程序
随着动态类型语言的发展,因为它们给了我们更多的灵活性,人们很可能会编写超出规范允许范围的程序。
当我阅读bobince的答案时,我的想法受到了这个问题的影响: 关于JavaScript的切片和拼接方法的问题
基本思想是splice
,在 Javascript 中,被指定为仅在某些情况下使用,但是,它可以在其他情况下使用,并且该语言无法阻止它,因为该语言被设计为非常灵活.
除非有人通读规范并决定遵守它,否则我相当肯定会发生许多此类违规行为。
这是一个问题,还是编写这种灵活语言的自然延伸?或者我们应该期望像 JSLint 这样的工具来帮助成为规范警察?
我喜欢这个问题的一个答案,python 的实现就是规范。我很好奇这是否真的更接近这些类型的语言的真相,基本上,如果语言允许你做某事,那么它在规范中。 有 Python 语言规范吗?
更新:
在阅读了一些评论之后,我想我会检查规范中的拼接方法,这就是我在 pg 104 底部找到的,http://www.mozilla.org/js/language/E262-3。 pdf,所以看来我可以在不违反规范的情况下在子数组上使用拼接。我只是不希望人们在我的示例中陷入困境,但希望能够考虑这个问题。
更新 2: 我对 JavaScript 不感兴趣,但对语言灵活性和规范不感兴趣。例如,我希望 Java 规范指定您不能将代码放入接口中,但使用 AspectJ 我经常这样做。这可能是一种违规,但作者并没有预测到 AOP,并且该工具足够灵活,可以用于此用途,就像 JVM 也足够灵活,可用于 Scala 和 Clojure。
java - 你能在动态语言中有太多的“动态”吗?
在过去的几个月里,我一直在从 Java 过渡到 Groovy,我可以体会到它带来的许多好处:更少的代码、闭包、构建器、最终使 Grails 之类的框架成为可能的 MOP、编写测试时易于模拟等.
然而,我的同事“指责”我的代码不够时髦。也就是说,我仍然为我的参数和字段声明类型,倾向于使用继承和多态而不是鸭子类型等。在我看来,在这些情况下,它不仅是动态与静态的,而且是动态与面向对象的范例一种困境。在这些情况下,我仍然倾向于选择 OO。我觉得 OO 范式在它的基本前提中具有很大的价值,它允许您将代码构造抽象和关联到特定的现实世界概念。
所以,这里有一些我需要帮助的特殊问题:
我应该为我的参数、字段等声明类型吗?
当简单方法可以时,我应该将代码块声明为闭包吗?
我什么时候应该使用鸭子类型而不是多态动态调度。例如,在 groovy 中我可以做 animal."$action"() 或 def animal; animal.action() ,而不是 Animal animal = new Dog(); 动物.action()。我可以在 Open-Closed 原则的上下文中看到问题,但还有其他原因更喜欢 OO 风格的多态性吗?
我什么时候应该在 groovy 中使用接口(如果有的话)?
我确信还有一些其他类似的困境我没有写下来。我还认为这些问题不仅适用于 groovy,而且适用于任何其他动态语言。你有什么意见?
unit-testing - 使用 Groovy MetaClass 覆盖方法
我有一个使用服务做某事的 POJO:
我有一个 Groovy 测试用例:
第一个测试方法testInjectedMockIFace
按预期工作:POJO 是使用IService
. 当callX
被调用时,它只是简单地返回“非常时髦”。这样,服务就被模拟出来了。
但是我不明白为什么第二种方法testMetaClass
不能按预期工作,而是在尝试调用callX
服务对象时抛出 NullPointerException。我以为我已经doCallService
用这一行覆盖了该方法:
我究竟做错了什么?
谢谢!
dependency-injection - 动态语言中是否需要依赖注入?
为了编写可测试的 C# 代码,我大量使用 DI。
然而最近我一直在搞乱 IronPython,发现你可以模拟任何方法/类/函数等......你喜欢,对 DI 的需求已经消失。
对于 Python 等动态语言,情况是否如此?
代替:
你可以有:
对于动态语言,因此根本不需要遵循动态语言的手动 DI。
对此有何建议?
programming-languages - 我怎样才能写一个又快又脏的解释器?
我有一次面试,有人告诉我可能会复习的领域之一是“动态编程语言”。所以我想我可能会在这个周末写一个作为示例代码。:-)
当然,考虑到时间限制,我计划编写一些非常基本的东西,最好使用一种语言和/或工具集,这将使它变得非常容易。我的大部分经验都是在 Python 中,但我愿意花一点时间学习新的东西,如果它能让任务更容易(并且不会花费太长时间)。有没有人在工具或语言方面对我有任何建议可以使这更容易?