- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读有关命令式编程模型的SICP书Here。我无法从两点理解插图:
。从square
到“对”的箭头(两个圆圈):该箭头是什么意思?尽管在本节中,箭头始终表示“封闭环境”,但该特定箭头似乎并不指向环境。(square
的环境是global env
,而不是“ pair”)
下面是一个正确的理解:在过程定义的值中,其“代码文本”部分(左侧的圆圈)内部没有符号的解释。它们只是“文本”。仅在过程应用程序中,它们在应用程序的上下文/环境中才有意义。
如果2是正确的,为什么选择该对environment part
中的箭头(右侧
圈)到封闭环境是否必要? (由于没有意义来解释过程定义内部过程代码中符号的含义。)
最佳答案
SICP的箭头符号有点过载。我将引用文本的相关部分来理解该图。
过程对象是一对,其代码指定过程具有一个形式参数,即x和过程主体(* x x)。过程的环境部分是指向全局环境的指针,因为这是在其中评估lambda表达式以生成过程的环境。将过程对象与符号正方形关联的新绑定已添加到全局框架。通常,define通过向框架添加绑定来创建定义。
因此,让我们分析每个箭头。
“全球环境”→正方形。该箭头似乎只是将正方形标记为象征着全球环境。值得注意的是,此环境是自define
在全局环境中被调用以来唯一有效的堆栈帧。
“正方形”→两个点。该箭头似乎表明,无论这两个点代表什么,都以在全局环境中找到的名称"square"
存储。
左点→“参数” /“主体”。此箭头指示左点是一个“对象”,被认为是要存储两段数据,即“形式参数列表”和“过程主体”。
右点→正方形。此箭头指示右点包含一个指向全局环境的“指针”。
该图为Lisp中的符号如何获得含义提供了高度可操作的POV。特别地,在特定的“上下文”中对符号进行“评估”。上下文是“环境框架”的链接列表,每个列表都包含一组名称→值映射。为了评估一个符号,在链接列表后跟随一个符号,并返回从符号名称映射的第一个值。举例来说,一个例子是
"foo" → { "bar" : 3 → { "foo" : 8 } → { "foo" : 10 }
, "baz" : 4 }
foo
通过“跳过”第一帧并在第二帧中找到值
8
而忽略第三帧,则返回
8
。此忽略功能很重要-它表明某些上下文的名称可能会遮盖较大上下文中的值。
define
将新名称→值映射添加到全局框架。
square
看起来像
+--- Formal parameter list
/ +--- Body of function
| |
(left: (x) (* x x)) (right: {global frame})
(square 3)
那样评估它时,我们使用
3
和形式参数列表创建一个新框架
{ "x" : 3 }
*
。由于它不在我们的新本地框架中,因此我们必须在全局框架中找到它。
"*" → { "x" : 3 } → { global frame }
"x" → { "x" : 3 } → { global frame }
x
存储在本地帧中,因此我们在此处找到了它,并将
3
和
3
作为参数传递给找到的乘法函数。
x
在全局框架中也具有含义,我们将在评估
square
主体的上下文中将其覆盖。
square
主体中lambda的定义
(lambda (x) (* x x))
(* x x)
时,我们将
x
看作是某个值(例如数字),但我们对此一无所知。在解释
(lambda (x) (* x x))
时,我们看到为了理解lambda内的短语的含义,我们必须为其提供
x
的含义。这大致是到处使用的变量和函数的标准语义。
define
破坏了语义。原因在以下代码片段中很明显
(define foo 3)
foo
(define foo 4)
foo
foo
的(据说是“固定但未知”)值从第2行更改为第4行。这是因为
define
允许我们编辑有效的堆栈帧在一个上下文中,而不仅仅是创建一个新的上下文,它像
lambda
一样遮盖了旧的上下文。这意味着我们必须考虑变量不是“固定的而是未知的”,而是一系列可变的槽,这些槽不能保证随时间的推移保持其值-这是一种更为复杂的语义,也许应迫使我们将
foo
称为“广告位”或“可分配”。
define
的行为,我们并未完全遵守该含义。
let
的表格,该表格可用于复制前面的示例而不会丢弃变量语义:
(let ((foo 3))
foo
(let ((foo 4))
foo)
foo)
foo
取值为
3
,第4行上的
foo
存在于不同的变量上下文中,因此仅遮蔽了第2行上的
foo
...从而取不同值固定值
4
,最后第5行的
foo
再次与第2行的
foo
相同,并且取相同的值。
let
允许我们创建任意的本地上下文(碰巧通过在幕后创建新的堆栈框架,这可能是您期望的)。让我们知道这些语义是安全的黄金法则被称为α转换,这有点不幸。该规则规定,如果您在一个上下文中各处均匀地重命名变量,则程序的含义不会改变。
(let ((foo 3))
foo
(let ((bar 4))
bar)
foo)
foo
阴影的影响,因此可能会减少一些混乱。
define
语义更安全吗?有点儿。您可能会想到以下转换:
(define x y) (define y x)
,而不允许使用
(define x 3) (define y x)
。
define
移至任何给定上下文(堆栈框架)的开头,并将它们置于依赖关系顺序。
define
”任何变量设置为错误
(define x ... definition of x ...)
(define y ... definition of y ...)
(define z ... definition of z ...)
... body ...
(let ((x ... definition of x ...))
(let ((y ... definition of y ...))
(let ((z ... definition of z ...))
... body ...)))
关于function - w.r.t.的三个问题评价的环境模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25666056/
可不可以命名为MVVM模型?因为View通过查看模型数据。 View 是否应该只与 ViewModelData 交互?我确实在某处读到正确的 MVVM 模型应该在 ViewModel 而不是 Mode
我正在阅读有关设计模式的文章,虽然作者们都认为观察者模式很酷,但在设计方面,每个人都在谈论 MVC。 我有点困惑,MVC 图不是循环的,代码流具有闭合拓扑不是很自然吗?为什么没有人谈论这种模式: mo
我正在开发一个 Sticky Notes 项目并在 WPF 中做 UI,显然将 MVVM 作为我的架构设计选择。我正在重新考虑我的模型、 View 和 View 模型应该是什么。 我有一个名为 Not
不要混淆:How can I convert List to Hashtable in C#? 我有一个模型列表,我想将它们组织成一个哈希表,以枚举作为键,模型列表(具有枚举的值)作为值。 publi
我只是花了一些时间阅读这些术语(我不经常使用它们,因为我们没有任何 MVC 应用程序,我通常只说“模型”),但我觉得根据上下文,这些意味着不同的东西: 实体 这很简单,它是数据库中的一行: 2) In
我想知道你们中是否有人知道一些很好的教程来解释大型应用程序的 MVVM。我发现关于 MVVM 的每个教程都只是基础知识解释(如何实现模型、 View 模型和 View ),但我对在应用程序页面之间传递
我想realm.delete() 我的 Realm 中除了一个模型之外的所有模型。有什么办法可以不列出所有这些吗? 也许是一种遍历 Realm 中当前存在的所有类型的方法? 最佳答案 您可以从您的 R
我正在尝试使用 alias 指令模拟一个 Eloquent 模型,如下所示: $transporter = \Mockery::mock('alias:' . Transporter::class)
我正在使用 stargazer 创建我的 plm 汇总表。 library(plm) library(pglm) data("Unions", package = "pglm") anb1 <- pl
我读了几篇与 ASP.NET 分层架构相关的文章和问题,但是读得太多后我有点困惑。 UI 层是在 ASP.NET MVC 中开发的,对于数据访问,我在项目中使用 EF。 我想通过一个例子来描述我的问题
我收到此消息错误: Inceptionv3.mlmodel: unable to read document 我下载了最新版本的 xcode。 9.4 版测试版 (9Q1004a) 最佳答案 您没有
(同样,一个 MVC 验证问题。我知道,我知道......) 我想使用 AutoMapper ( http://automapper.codeplex.com/ ) 来验证我的创建 View 中不在我
需要澄清一件事,现在我正在处理一个流程,其中我有两个 View 模型,一个依赖于另一个 View 模型,为了处理这件事,我尝试在我的基本 Activity 中注入(inject)两个 View 模型,
如果 WPF MVVM 应该没有代码,为什么在使用 ICommand 时,是否需要在 Window.xaml.cs 代码中实例化 DataContext 属性?我已经并排观看并关注了 YouTube
当我第一次听说 ASP.NET MVC 时,我认为这意味着应用程序由三个部分组成:模型、 View 和 Controller 。 然后我读到 NerdDinner并学习了存储库和 View 模型的方法
Platform : ubuntu 16.04 Python version: 3.5.2 mmdnn version : 0.2.5 Source framework with version :
我正在学习本教程:https://www.raywenderlich.com/160728/object-oriented-programming-swift ...并尝试对代码进行一些个人调整,看看
我正试图围绕 AngularJS。我很喜欢它,但一个核心概念似乎在逃避我——模型在哪里? 例如,如果我有一个显示多个交易列表的应用程序。一个列表向服务器查询匹配某些条件的分页事务集,另一个列表使用不同
我在为某个应用程序找出最佳方法时遇到了麻烦。我不太习惯取代旧 TLA(三层架构)的新架构,所以这就是我的来源。 在为我的应用程序(POCO 类,对吧??)设计模型和 DAL 时,我有以下疑问: 我的模
我有两个模型:Person 和 Department。每个人可以在一个部门工作。部门可以由多人管理。我不确定如何在 Django 模型中构建这种关系。 这是我不成功的尝试之一 [models.py]:
我是一名优秀的程序员,十分优秀!