- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
如果您愿意,请将标题更改为更合适的名称。
我正在以面向对象程序的形式制作一些东西,这里定义了一个名为 world
的复合体:
(define-struct world (var1 var2 var3 loo))
其中“var”1 到 3 是Number
,代表一些世界变量,如温度、湿度等。loo
是“list of objects”的缩写,对象被定义下面:
(define-struct obj (id act))
其中 id
是 Integer
并且是对象的 ID,而 act
是另一个复合:
(define-struct act (trigger command))
其中trigger
后面会解释,command
是一个String
,代表一个command,会在程序的其他部分解析。
这是我的问题:我希望 trigger
是一个表达式,如果世界上的某些变量以某种方式返回 true
,例如,我想使 var1
和 var2
具有相同的值时,发出命令 "start-rain"
。一段“虚构的”代码如下所示:
(define (get-commands loo0)
(local [(define (fn-for-loo todo rsf)
(cond [(empty? todo) rsf]
[else (fn-for-obj (first todo)
(rest todo)
rsf)]))
(define (fn-for-obj obj todo rsf)
(if (true? (act-trigger (obj-act obj)))
(fn-for-loo todo (cons (act-command (obj-act obj)) rsf))
(fn-for-loo todo rsf)))]
(fn-for-loo loo0 empty)))
如果难以理解,这里有一个带注释的版本:
(define (get-commands loo0) ;;-------------------------------------------------This function returns (listof String), it uses local for tail-recursion
(local [(define (fn-for-loo todo rsf) ;;------------------------------------rsf is result-so-far accumulator, it is (listof String)
(cond [(empty? todo) rsf] ;;-------------------------------------rsf returned as final output of entire function when all objects are checked
[else (fn-for-obj (first todo) ;;--------------------------if some objects are unchecked, pass objects to fn-for-obj to check the first
(rest todo)
rsf)]))
(define (fn-for-obj obj todo rsf) ;;--------------------------------receiving one object of attention, other unchecked object and result-so-far
(if (true? (act-trigger (obj-act obj))) ;;-----------------------if the trigger returns true...
(fn-for-loo todo (cons (act-command (obj-act obj)) rsf)) ;;--add current object's command to the list of commands and pass on to fn-for-loo
(fn-for-loo todo rsf)))] ;;----------------------------------if trigger returns false, pass on without modification to rsf
(fn-for-loo loo0 empty))) ;;---------------------------------------------this kick-starts the local functions
我的问题是我不知道 trigger
应该是什么,它必须是根据 world
中的变量返回 Boolean
的东西.当然,世界的变量可以通过词法作用域或直接引用访问,但是我如何在程序知道之前在 object
中编写 trigger
的表达式世界变量将可用?
我正在尝试这样的事情:
(define OBJ1 (make-obj 1
(make-act (= var1 var2) "start-rain")))
但编译器说“var1 未定义”
最佳答案
如果你想访问世界的一部分,你需要传递世界:
(define (get-commands w loo0)
(local [(define (fn-for-loo todo rsf)
(cond [(empty? todo) rsf]
[else (fn-for-obj (first todo)
(rest todo)
rsf)]))
(define (fn-for-obj obj todo rsf)
(if ((act-trigger (obj-act obj)) w)
(fn-for-loo todo (cons (act-command (obj-act obj)) rsf))
(fn-for-loo todo rsf)))]
(fn-for-loo loo0 empty)))
(define OBJ1
(make-obj 1
(make-act (lambda (w) (= (world-var1 w) (world-var2 w)))
"start-rain")))
(define OBJ2
(make-obj 2
(make-act (lambda (w) (= (world-var1 w) (world-var3 w)))
"go-home")))
(true?
谓词不是很有用。)
测试:
(define w0 (make-world 1 1 1 (list OBJ1 OBJ2)))
> (get-commands w0 (world-loo w0))
'("go-home" "start-rain")
许多人更愿意使用标准的高阶函数:
(define (get-commands w loo0)
(foldl (lambda (o rs) (if ((act-trigger (obj-act o)) w)
(cons (act-command (obj-act o)) rs)
rs))
'()
loo0))
请注意,您的代码以列表中对象的相反顺序生成命令。
如果你想让它们按相同的顺序排列,你可以这样做:
(define (get-commands w loo0)
(foldr (lambda (o rs) (if ((act-trigger (obj-act o)) w)
(cons (act-command (obj-act o)) rs)
rs))
'()
loo0))
或者这个:
(define (get-commands w loo0)
(let ((triggered (filter (lambda (o) ((act-trigger (obj-act o)) w)) loo0)))
(map (lambda (o) (act-command (obj-act o))) triggered)))
关于oop - DrRacket : How can I store an "equality detector" in a compound variable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41252755/
我正在将 Racket 和 DrRacket 用于一个小项目(我正在尝试学习两者并使用它们来教我的 friend 一些函数式编程)。 我刚刚发现了自动完成功能 (C-/),它与库函数一起工作得很好,但
我正在使用 DrRacket 调试使用 R5RS 语言的方案代码。我正在尝试调试使用加载函数导入的多个文件。我按照 Dr Racket 网站上的说明打开了这两个文件,但是在调试时,其他文件中的函数被跳
我有这个问题。它很长。 首先,这里是这个的数据定义 (define-struct ball (x y color)) ;; Ball = (make-ball Number Number Col
因此,我正在尝试在scheme中编写以下函数,并使其能够在DrRacket上运行。问题如下, make5 -接受两个整数,并返回一个5位数的整数,该整数由第一个输入的最右3位和第二个输入的最左2位构成
如何通过组合较长列表(例如 4 个元素)中的任意两个元素来生成序列列表? 例如,我想获取 '(1 2), '(1 3), '(1 4), '(2 3)、'(2 4)和基于'(1 2 3 4)的'(3
我目前在 Mac OS X 上使用 DrRacket 并选择语言“R5RS”,但是当我输入时 (random 100) 我收到错误消息: reference to undefined identifi
我希望有人能指导我正确的方向:我正在寻找两个在两个列表中生成所有可能的项目组合: 示例: 给定列表 '(symbol1 symbol2) 和 '(1 2),我希望生成: (list (list 'sy
在链接 http://www.ccs.neu.edu/home/ryanc/macro-stepper/tutorial.html 上有使用宏步进器的说明。 但是,当我要尝试时,我无法在非零定义中获得
所以我正在为我的编程语言课做一些练习题,其中一项作业是创建一个脚本“MyEval”,它允许您进行简单的嵌套加法和乘法。因此,例如程序将能够执行此 (MyEval '(1 +(3 *4))) 或更深入的
我想让 DrRacket 的默认启动画面成为他们用于情人节的特殊启动画面。将它显示在屏幕上的一种方法是将计算机上的时间更改为 2 月 14 日。如何在不更改时间的情况下将其设置为默认启动画面? 在这里
我想显示文本然后覆盖它(对于简单的进度条等)。在 Linux 和 Windows 的终端中运行 Racket 时,显示回车 ( "\r" ) 的常用技巧工作正常,但在 DrRacket 和 GRack
我用初级学生语言编写了一个小模块。当我单击“运行”时,“定义”窗口中的某些表达式以反白显示(黑色背景上的红色文本)。我无法弄清楚选择了哪些表达方式或反向视频的含义。 最佳答案 根据颜色偏好,它表示测试
我是一名大学生,想通过“The Scheme编程语言”作为自学。 这是一个简单的程序,我将其命名为“reciprocal.ss” (define reciprocal (lambda (n) (if(
如何为 DrRacket 插件编写软件测试?考虑到插件本质上是 Racket 中的一个单元,它不能像函数一样简单地调用。 最佳答案 您可以在此处使用几个选项。 创建一个虚拟单元来链接——基本上是一个“
方括号在按钮“P”旁边和“Enter”之前。所以我想更改它们,以便可以将它们用作括号而不是方括号。 这样打字更容易。 我也找到了答案,但提前让人们知道。 偏好 -> 编辑 -> 方案 或 Racket
我最近一直在使用一些函数,我有一个适用于某些情况的函数,我需要一个通用函数。 我需要一个正则表达式,以便它准确地找到我正在寻找的东西,而不仅仅是它的痕迹。 我有这个,例如 >(regexp-repla
Racket 编程语言的核心是什么?核心是基于任何带有所有附加功能的 RnRS 规范,例如基于该微小核心的众多序列方法,还是语言核心的引用部分中的所有内容? 最佳答案 Racket 建立在由 #%ke
我的兄弟想向我介绍 lisp 语言,所以他在他的电脑上向我展示了 DrRacket。一切看起来都很棒,包括 arrows指向导入函数的位置,以及 documentation bubble告诉你一个函数
考虑这个片段: #lang racket (define (f i) (if (> i 5) 0 (+ 1 (f (+ 1 i))))) 在这里,对 f 的调用不在尾部位置
赞 Racket - how to get the “previous executed command” in bash script?但是有了 DrRacket。如何在 DrRacket 中获取先
我是一名优秀的程序员,十分优秀!