- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我知道一切都是对象,而您在 Smalltalk 中向对象发送消息以完成几乎所有事情。现在我们如何实现一个对象(内存表示和基本操作)来表示原始数据类型?比如整数的+
是如何实现的?
我查看了 Smalltalk 的源代码,并在 Smallint.st
中找到了它。有人能解释一下这段代码吗?
+ arg [
"Sum the receiver and arg and answer another Number"
<category: 'built ins'>
<primitive: VMpr_SmallInteger_plus>
^self generality == arg generality
ifFalse: [self retrySumCoercing: arg]
ifTrue: [(LargeInteger fromInteger: self) + (LargeInteger fromInteger: arg)]
]
最佳答案
从概念上讲,原始方法是由虚拟机 (VM) 而非常规 Smalltalk 代码实现的行为(例程)片段。
当 Smalltalk 编译器找到语句 <primitive: ...>
时它将其解释为一种特殊类型的方法,其参数(在您的情况下为 VMpr_SmallInteger_plus
)表示 VM 中目标例程的整数索引。
在这个意义上,原语是一个全局例程,不绑定(bind)到 MethodDictionary
任何特定类别的。原始逻辑适用于某些类的接收器和参数,这就是为什么它必须检查接收器和参数(如果有的话)是否符合其要求。如果不是,原语 fails 并且在这种情况下,控制流向紧跟 <primitive: ...>
的 Smalltalk 代码。陈述。否则原语 succeeds 和下面的 Smalltalk 代码不会被执行。还要注意,除了在 <primitive:...>
之上的临时声明之外,编译器不允许任何 Smalltalk 代码。句子。
在您的示例中,如果参数 arg
不是预期的类(大概是 SmallInteger
),例程放弃尝试将其求和到接收器并将操作的分辨率委托(delegate)给 Smalltalk 代码。
如果参数恰好是 SmallInteger
,原语将计算结果(使用 VM 中保存的例程)并用它来回答。
我还没有看到这个原语的代码,但是如果总和的结果不适合 SmallInteger
,也可能会发生原语失败的情况。 ,在这种情况下,接收者和参数都将被强制转换为 LargeInteger
s 并且添加将发生在 #+
相应类的方法(LargePositiveInteger
或 LargeNegativeInteger
)。
Smalltalk 代码的另一个分支允许在 SmallInteger
之间实现多态和。和任何其他类型的对象。例如,如果您评估 3 + 4.0
,Smalltalk 代码的这一部分就会发生。因为在这种情况下,参数是 Float
.如果您评估 3 + (4 / 3)
,也会发生类似的情况。等。
关于oop - Smalltalk:原语是如何实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39321776/
我对 JS 还很陌生,目前正在学习对象,对原语有点困惑。在 W3schools 上,javascript 原语定义为: “原始值是没有属性或方法的值。 原始数据类型是具有原始值的数据。 JavaScr
我可以用 java 做这个吗? private static boolean isRight(){ return new Random.nextBolean(); } boolean test
OpenCV 原语是否基于 CUDA Nvidia 性能原语 (NPP)? 我所说的原语是指在 NPP 库中实现的相同原语,例如:boxFilter、Mirror、Convolution... 我想知
这个问题在这里已经有了答案: How many integers can I create in 1GB memory? (3 个答案) 关闭 6 年前。 引用自 Algorithms 4th ed
我正在尝试编写我的第一个显示三角形的 DirectX 10 程序。一切都编译得很好,渲染函数被调用,因为背景变成了黑色。但是,我尝试使用三角形 strip 基元绘制的三角形根本不显示。 初始化函数:
什么是 UI 原语? if you find yourself wishing that you had a different set of UI primitives to work with,
我知道这个问题已经在 Stakoverflow 中被问过多次。但是没有一个解决方案对我有帮助。谁能告诉我做错了什么 我有一个 Controller Action 如下 Function WF
我正在尝试从一个程序中读取一个二进制文件,该程序将日志(某种)写入一个dat文件,我已经很好地找到了使用Java的格式。我这样加载它: DataInputStream in = new DataInp
我有代码对 MVC Controller 方法进行 AJAX 调用,如果我这样做,它会顺利工作: var obj = '{"titlename":"whatever"}'; $
我有一个对象: class Data{ int a; int b; AtomicIntegerArray c = new AtomicIntegerArray(10000); }
我的应用程序具有以下 Javascript 原语: var bearerToken = "a"; var expirationDate = "b"; var firstName = "c"; var
我经常发现自己需要让组件接受任何有效的 HTML 属性以使底层 HTML 元素使用它们。 class Input extends React.Component { // Here I use o
我尝试使用 javascriptserializer 反序列化我的 json,但收到错误“无效的 json 原语” 其他帖子提到要验证 json,我也这样做了。 JavaScriptSerialize
有没有办法制作一个原语并反复使用它?例如:如果我制作一个立方体,我可以创建 100 个立方体并制作一个 10x10 的网格吗?我试过使用 for 循环并在每个循环中更新 x 和 z 坐标,但它只移动在
扩展和装箱 Java 原语。 我知道不可能将包装类从一个扩展到另一个,因为它们不是来自同一继承树。为什么不能将基元扩展为另一种基元类型并自动装箱扩展的基元? 鉴于可以将字节参数传递给需要 int 的方
你能帮我解决这个问题吗?我有一个 asp.net 应用程序,在此我使用 Javascript 序列化程序序列化数据集,然后转换为列表。该代码如下所示。 JavaScriptSerializer jso
好的,所以当我尝试运行我的应用程序时遇到这个问题: Invalid JSON primitive: . public static void ReloadConfig() { if (!Fil
我正在尝试通过以下 jQuery Ajax 调用将字符串化的 JSON 对象发送到 MVC 方法: $.ajax({ type: "POST", url:
当我在 C# 中使用 JavaScriptSerializer 时,出现“无效的 JSON 原语”异常。我假设问题出在我的 json 输入字符串上,但我没有看到问题。 JavaScriptSerial
我知道您可以直接从 Scala 访问 java 原语 val javaDouble = new java.lang.Double(1.0) 这是否意味着我们正在通过包装器或直接访问原语?语法 new
我是一名优秀的程序员,十分优秀!