我是球拍/方案的新手,所以我决定通过为DCPU-16(一个简单的16位处理器)实现仿真器来学习.
我的问题是:实施我的解决方案的更好方法是什么?
这是我一起攻击控制cpu寄存器的解决方案.重点是允许修改寄存器的函数链接在一起.例如:
; Increment value stored in register r-id
; returns the updated register
;
; Reg - the register structure
; (reg-inc Reg 'SP)
(define (reg-inc reg r-id)
(reg-write reg r-id (+ (reg-read reg r-id) 1 )))
; chain them together
;(reg-inc (reg-inc Reg 'SP)
; 'PC)
;
; returns structure with both 'SP and 'PC incremented
Run Code Online (Sandbox Code Playgroud)
我的注册解决方案的全文如下.我的完整程序也在github上.有这么多重复的逻辑,我知道必须有一个更简单的方法:
(struct registers (A B C X Y Z I J SP PC O Pa Pb Paadr …Run Code Online (Sandbox Code Playgroud) 我看到了几个append向列表实现元素的例子,但都没有使用尾递归.如何在功能风格中实现这样的功能?
(define (append-list lst elem) expr)
Run Code Online (Sandbox Code Playgroud) lisp scheme tail-call-optimization racket tailrecursion-modulo-cons
我正在使用Racket和DrRacket进行一个小项目(我正在尝试学习它们并使用它们来教我的朋友一些函数式编程).
我刚刚发现了自动完成功能(C- /),它可以很好地处理库函数,但它不会看到我自己的函数.
我还补充说
(provide (all-defined-out))
Run Code Online (Sandbox Code Playgroud)
在我的源文件的开头(我认为自动完成功能可能看不到符号,因为它们不会被导出)但这并不能解决问题.
所有符号都可以在DrRacket REPL中访问(我可以评估我的功能,它们工作正常).
你能告诉我如何解决这个问题吗?我需要配置什么吗?
我正在尝试使用(call-cc)方法在方案中实现try-catch块,但我不确定它是如何用于此的.我找不到任何例子.
并且发现示例只包含错误处理,但我想要做的是:如果发生错误,方案程序必须向用户发送消息(通过显示示例)而不挂起程序.
那可能吗?
在编写Racket宏的过程中,"3D语法"是什么意思?
我已经听过几次这句话了.包括一次参考我写的宏.但那是一段时间以前; 我修好了,现在我不记得我到底做错了什么.
另外:3D语法总是坏的吗?或者是它eval(如果你认为你需要使用它,你可能错了,但在专家手中有一些有效的用途)?
我的Racket GUI应用程序在退出时需要做很多清理工作,即当用户按下X按钮时.这些包括杀死子进程(在Windows上不是自动进程)等.
将.rkt包装在shell脚本中等待然后进行清理对我来说有点过于讨厌.Racket文档中有许多退出处理程序(退出处理程序等),但它们似乎都不起作用!
我试图在方案中使用check-expect函数,但我一直被告知它是一个未绑定的check-expect标识符.不检查 - 期待我已经可以使用的功能吗?以下是我的代码:
#lang racket
(define contains (lambda (item list*)
(if (equal? list* '())
#f
(if (equal? item (car list*))
#t
(contains item (cdr list*))))))
(define z (list 1 2 3))
(define q (list 4 5 6))
(define p (list "apple" "orange" "carrot"))
(check-expect (contains 1 z) #t)
Run Code Online (Sandbox Code Playgroud) 正如标题所暗示的,我不明白定义结构时使用#:transparent和使用之间的区别#:prefab.该参考文献提到预制件涉及某种全球共享.
他们之间有什么区别?我应该在哪种情况下使用另一种?
我正在尝试在Racket中编写一个模块元语言mylang,它接受第二种语言传递修改后的正文,这样:
(module foo mylang typed/racket body)
Run Code Online (Sandbox Code Playgroud)
相当于:
(module foo typed/racket transformed-body)
Run Code Online (Sandbox Code Playgroud)
当然,typed/racket部件可以用任何其他模块语言替换.
我尝试了一个简单的版本,让身体保持不变.它在命令行上运行正常,但在DrRacket中运行时出现以下错误:
/usr/share/racket/pkgs/typed-racket-lib/typed-racket/typecheck/tc-toplevel.rkt:479:30: require: namespace mismatch;
reference to a module that is not available
reference phase: 1
referenced module: "/usr/share/racket/pkgs/typed-racket-lib/typed-racket/env/env-req.rkt"
referenced phase level: 0 in: add-mod!
Run Code Online (Sandbox Code Playgroud)
这是整个代码:
#lang racket
(module mylang racket
(provide (rename-out [-#%module-begin #%module-begin]))
(require (for-syntax syntax/strip-context))
(define-syntax (-#%module-begin stx)
(syntax-case stx ()
[(_ lng . rest)
(let ([lng-sym (syntax-e #'lng)])
(namespace-require `(for-meta -1 ,lng-sym))
(with-syntax ([mb (namespace-symbol->identifier '#%module-begin)])
#`(mb . …Run Code Online (Sandbox Code Playgroud) 我无法理解Scheme中收集器函数的使用.我正在使用"The Little Schemer"一书(Daniel P. Friedman和Matthias Felleisen).一个有一些解释的综合例子对我有很大帮助.使用收集器函数的函数示例如下:
(define identity
(lambda (l col)
(cond
((null? l) (col '()))
(else (identity
(cdr l)
(lambda (newl)
(col (cons (car l) newl))))))))
Run Code Online (Sandbox Code Playgroud)
......有一个例子叫做存在(identity '(a b c) self)和self-function存在(define self (lambda (x) x)).该identity函数返回给定的列表l,因此给定调用的输出将是(a b c).使用的确切语言是R5RS Legacy语言.