在阅读SICP时出现了这个问题.为什么要(list 'quote '(a b c))由解释(评估R5RS在Dr.Racket)作为'(a b c).对我来说应该是(quote (a b c)).例如,(list 'quot '(a b c))被评估为(quot (a b c)).有什么特别的'quote?
我试图理解PLT-Scheme 372中对,缺点,虚线元组和正确列表之间的关系.我的问题的详细背景如下:
在阅读了一些教科书并进行反复试验后,我得到了以下理解和直观的想法(我可能错了......):
所有列表都是对,例如:
(pair? (list 'a 'b 'c)) => #t
所有的意思都是成对的,例如:
(pair? (cons 'a (cons 'b 'c))) => #t
一些以点分隔的元组是成对的,例如:
(pair? '(a . b)) => #t
(pair? '(a . b . c)) => #t 在标准R5RS中,它不是合法的语法.
然后我遇到了这个问题:为什么'(a.b.c)评价为(bac)?我在哪里可以找到完整的dot使用手册?
'(a . b) => (a . b)
'(a . b . c) => (b a c)
'(a . b . c . d) => illegal use of `.'
'(cons 'a …Run Code Online (Sandbox Code Playgroud) 我希望这已经没有被问过了.我看到了一堆单引号和其他语言的双引号(html,javascript,python)但找不到方案
在解释器的计划中,如果我键入:
(某些'x)我理解x将被视为x,而不是像某个变量那样被评估为某个东西
另一方面,如果我使用
(x)
x被评估为它的变量
我知道'是引用的简称(即(引用x))但我得不到的是它与双引号的区别.
如果我输入
在你的提示"你好",我回来了"你好"
唯一的区别是双引号保留数据的引号?我听说双引号就像一个char数组,但它没有得到评估,单引号也没有,所以这就是差异,何时/为什么我会使用一个而不是另一个?
谢谢大家.
我正在学习Scheme课程,必须完成以下任务.我必须编写一个函数,它获得两个相同长度的列表A和B,并返回一个列表,其中每个项目都是两个项目的列表 - 一个来自A,第二个来自B.
例如函数得到'(1 2 3 )和'(4 5 6)并返回'((1 4)(2 5)(3 6)).我可以使用这样的地图做到这一点:
(define(func lst1 lst2)(map(lambda(xy)(list xy))lst1 lst2))
但问题是通过foldr并没有明确的递归来做到这一点.
谁能帮帮我吗?我不知道该怎么做....
谢谢!
我是Scheme的新手。我编写了一个程序,该程序定义了一个名为“ run”的函数,并将其存储为“ Run.scm”。然后,我有一个“ test.scm”文件,该文件使用了我在“ Run.scm”中定义的“运行”功能。我不知道如何在“ test.scm”中包含“ Run.scm”,以便可以在测试文件中使用“ run”功能。谁能帮我?
我一直在尝试编写返回矩阵转置的函数.所以输出的例子就是,(transpose (list '(1 2) '(4 5))) ;==> ((1 4) (2 5)) 这是我的功能:
(define transpose
(lambda (m1)
(if (null? (cadr m1))
null
(list (indiv (car m1) (cadr m1)) (transpose (rest m1))))))
(define indiv
(lambda (l1 l2)
(if (empty? l1)
null
(list (list (car l1) (car l2)) (indiv (rest l1) (rest l2))))))
Run Code Online (Sandbox Code Playgroud)
indiv函数负责行递归,而transpose调用indiv函数来获取转置.我的问题是为什么不能 (if (null? (cadr m1))检查我是否到达了矩阵的最后一行?有没有办法在计划中检查这个?我不想用另一种方法来解决这个问题,我只是想知道这是否可行,如果是,那么如何?
我编写了一个非常简单的函数来为我提供两个边界之间所有整数的列表.
但是,它不是输出一个列表,而是给我一个由嵌套的mcons单元格构成的数据结构.
我究竟做错了什么?
#lang racket
(require rnrs/base-6)
(define (enumerate low high)
(if (> low high)
'()
(cons low
(enumerate (+ low 1) high))))
(enumerate 1 10)
;(mcons 1 (mcons 2 (mcons 3 (mcons 4 (mcons 5 (mcons 6 (mcons 7 (mcons 8 (mcons 9 (mcons 10))))))))))
Run Code Online (Sandbox Code Playgroud) 我正在编写一个带有(split L)
列表的递归函数L,并返回一个包含两个子列表的新列表,第一个子列表包含每个第二个元素,L
第二个列表包含不在第一个子列表中的其余元素.
以下是拆分应如何工作的示例:
(split ‘(1 2 3 4 5 6 7 8) ) ( (1 3 5 7) (2 4 6 8))
(split ‘(cat bird dog horse mouse pig tiger gerbil cow) )
( (cat dog mouse tiger cow) (bird horse pig gerbil))
Run Code Online (Sandbox Code Playgroud)
现在这是我的尝试:
(define split
(lambda (L)
(if
(null? L)
'()
(list (first L) (second L))
)
)
)
(define first
(lambda (L)
(if
(null? L)
'()
(cond
(
(null? (cdr L))
(car …Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个转换let形式表达式的函数:
Run Code Online (Sandbox Code Playgroud)(let ((var1 exp1) ... (varn expn)) body)
转换lambda为以下形式的(等效)表达式:
((lambda (var1 ... varn) body) exp1 ... expn)
我发现该问题的大多数解决方案似乎都是错误的,有人可以确认是这种情况吗?
;; let expression
(define (let-vars expr) (map car (cadr expr)))
(define (let-inits expr) (map cadr (cadr expr)))
(define (let-body expr) (cddr expr))
(define (let->combination expr)
(cons (make-lambda (let-vars expr) (let-body expr))
(let-inits expr)))
Run Code Online (Sandbox Code Playgroud)
我相信let->combination会返回这种形式的清单:
((lambda (var1 ... varn) body) (exp1 ... expn))
Run Code Online (Sandbox Code Playgroud)
但是,我认为它应该返回的是以下形式的列表:
((lambda (var1 ... varn) body) exp1 ... …
我应该写一个函数,打印一组给定的三个数字中两个更大数字的平方和.
我笨拙地处理了这种情况.我没有编写一个函数来返回一组3中的两个最大数字,而是编写了函数,以便表达式减少到所需的两个数字.#SSL功能.
我必须这样做的原因是我无法编写可以将多个值一起返回的LISP函数,并且我无法编写可以读取两个值作为参数的LISP函数.
有没有办法可以抽象出其他程序中最大数字的计算?
(define
(min a b)
(if (> a b) b a)
)
(define
(max a b)
(if (< a b) b a)
)
(define
(square a)
( * a a)
)
(define
(ssl a b c)
(+ (square (max a b)) (square (max (min a b) c)))
)
Run Code Online (Sandbox Code Playgroud)