我可以一起定义许多变量,如下所示:
(match-define (list a b c) (list 1 2 3))
a
b
c
Run Code Online (Sandbox Code Playgroud)
输出:
1
2
3
>
Run Code Online (Sandbox Code Playgroud)
但是,如何稍后在程序中重新定义这些变量?
本质上,我正在寻找“匹配重新定义”功能或宏。
以下操作无效:
(set! (list a b c) (list 10 20 30))
set!: not an identifier in: (list a b c)
Run Code Online (Sandbox Code Playgroud)
我也尝试过地图功能:
> (map set! (list a b c) (list 5 6 7))
. set!: bad syntax in: set!
>
Run Code Online (Sandbox Code Playgroud)
我需要为此编写一个函数还是有一些简单的内置方法?
编辑:我尝试了以下match-redefine宏,该宏写在https://docs.racket-lang.org/guide/pattern-macros.html上swap宏的行上:
(match-define (list a b c) (list 1 2 3))
(println "------- sl --------")
(define sl (list a b …Run Code Online (Sandbox Code Playgroud) 我很擅长计划,现在正在学习基础知识.我明白在(+ 1 2)+中就像一个函数接受两个输入并返回输出.我的测验有一个问题(+ (-(*))4 5).根据DrRacket的说法,答案是8,但我很难理解为什么会这样.所以我需要帮助理解给定表达式如何计算为8.
我对Common Lisp中的函数副本有疑问.
在Scheme中我会选择:
(define (foo par1 par2) (+ par1 par2))
(define bar foo)
(print (bar 1 2)) ;; --> prints 3
(define (foo par1 par2) (* par1 par2))
(print (bar 1 2)) ;; --> prints again 3
(print (foo 1 2)) ;; --> prints 2
Run Code Online (Sandbox Code Playgroud)
我怎么能用Common Lisp做到这一点?
Racket是一种高级功能语言.但是,似乎名为let的构造允许类似goto的功能并允许编写类似意大利面条的代码:
(define i 1)
(let mylabel ()
(set! i (add1 i))
(println "Doing something...")
(when (even? i)
(println "going to mylabel because i is even")
(mylabel) )
(when (= 0 (modulo i 3))
(println "going to mylabel because i is divisible by 3")
(mylabel) )
(println "Doing something more ...")
(when (= i 7)
(println "going to mylabel because i is 7")
(mylabel) )
(when (> i 10)
(println "ending because i is 10")
)
(println i)
)
Run Code Online (Sandbox Code Playgroud)
这不是包含goto的功能吗?
如何获得每个子列表的产品?尝试:
(apply map * '((1 2) (3 4)))
Run Code Online (Sandbox Code Playgroud)
但它返回:'(3 8),而它应该返回'(2 12)
我的理解是,'Scheme 中的单引号用于告诉Scheme,后面的内容是符号而不是变量.因此,不应该评估它.基于这种理解,1.0当我进入'3/3REPL 时,我不明白为什么鸡打印.
CHICKEN
(c) 2008-2016, The CHICKEN Team
(c) 2000-2007, Felix L. Winkelmann
Version 4.11.0
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ]
compiled 2016-08-23 on buildvm-13.phx2.fedoraproject.org
#;1> '3/3
1.0
Run Code Online (Sandbox Code Playgroud)
我希望它能打印出来3/3.为什么要对此进行评估而不是报价?谢谢.
如果我在Lisp中定义以下过程会发生什么: (define(p)(p)) 它将返回什么值?我不是编程的新手,但我正在阅读这本书更深入,并使用Lisp作为例子,这让我感到困惑.
我希望在Scheme中创建一个函数,它接受一个谓词和一个元素列表,然后输出两个单独的列表.一个具有匹配给定谓词的原始列表的元素,另一个具有与其不匹配的元素.
我现在所拥有的代码我认为应该隔离与谓词匹配的代码并输出它们的列表,但代码将无效.
(define tear
(lambda (pred xs)
(cond[(null? xs) '()]
[(list? (car xs))(cons((tear (pred (car xs)))(tear (pred (cdr xs)))))]
[(pred (car xs))(cons((car xs)(tear (pred (cdr xs)))))]
[else tear (pred (cdr xs))])))
(tear number? '(1 2 3 a b c))
Run Code Online (Sandbox Code Playgroud)
我的编译器产生的结果是:
tear: arity mismatch;
the expected number of arguments does not match the given number
expected: 2
given: 1
arguments...:
#f
context...:
/home/jdoodle.rkt:2:4: tear
Command exited with non-zero status 1
Run Code Online (Sandbox Code Playgroud)
您可以提供的任何帮助/信息将非常感谢.
我开始学习Lisp,并使用Lispworks个人版6.1.1,在评估基本功能时遇到了问题。我能够在Scheme中正确设置它们,但是当我尝试在Lisp中评估它们时它们却无法正常工作。
我在Lisp中知道每个符号都有两个命名空间。因此,我尝试编写用于组成两个过程的简单过程。它在Scheme中运行良好,但是在Lisp中存在评估问题。
方案中的代码可以正常工作并返回2
(define (comp a b)
(lambda (x)
(a (b x))))
(define test (comp car cdr))
(test '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
用Lisp重写相同的代码
(defun comp (a b)
(lambda (x)
(funcall a (funcall b x))))
(defun test (comp #'car #'cdr))
(funcall test '(1 2 3))
Run Code Online (Sandbox Code Playgroud)
lispworks中的错误是:
试图绑定非符号,
(FUNCTION CAR)。
所以当我尝试(defun test (comp #'car #'cdr))在听众中评估时,我得到
非符号
(FUNCTION CAR)在function中用作变量名TEST。
我不明白为什么它不能这样写。我会很感激
编程语言:Scheme / DrRacket
我发现foldr和之间的用法没有区别apply
谁能解释他们的不同之处?据我所知,使用文件夹可以实现与应用相同的功能。谢谢!