Scheme Dr球拍列表函数

Scheme Dr球拍列表函数,scheme,racket,Scheme,Racket,定义一个过程,该过程获取一个列表并返回在给定列表中的每对相邻元素之间插入符号“like”的列表 我觉得这应该很容易,但我一直在获取列表列表,所以检查不起作用。我在这个问题上纠缠了一个多小时。我尝试了append和list*以及其他一些方法,但我不知道如何将列表的列表折叠成一个列表,或者只是让函数使用检查。在BSL+中对此有任何帮助都将非常有用。无论如何,这就是我所拥有的: ; likenate : List -> List (check-expect (likenate (list 'h

定义一个过程,该过程获取一个列表并返回在给定列表中的每对相邻元素之间插入符号“like”的列表

我觉得这应该很容易,但我一直在获取列表列表,所以检查不起作用。我在这个问题上纠缠了一个多小时。我尝试了append和list*以及其他一些方法,但我不知道如何将列表的列表折叠成一个列表,或者只是让函数使用检查。在BSL+中对此有任何帮助都将非常有用。无论如何,这就是我所拥有的:

; likenate : List -> List

(check-expect (likenate (list 'here 'be 'dragons)) 
              (list 'here 'like 'be 'like 'dragons))

(check-expect (likenate (list 'that 'is 'so 'cool)) 
              (list 'that 'like 'is 'like 'so 'like 'cool))

(check-expect (likenate (list 'like 'like)) 
              (list 'like 'like 'like))

(define (likenate list_like)
   (cond [(empty? list_like) '()]
   [else  (list (first list_like) 'like (likenate (rest list_like)))
  ]))
以下是我的版本:

(define (likenate lst)
  (cond ((empty? (rest lst)) lst)
        (else (list* (first lst) 'like (likenate (rest lst))))))

你们很接近了,而且你们在正确的轨道上思考列表*。事实上,在您的尝试中,用list*替换list会产生这个程序,这几乎完全正确:

(define (likenate lst)
  (cond [(empty? lst) '()]
        [else (list* (first lst) 'like (likenate (rest lst)))]))
你可以把list*看作是多个conse的简写。简单地说,list*abc等同于consaconsbc。这是必要的,因为LIKETE的结果是一个列表,所以它需要是cons对的cdr元素,cons对是通过将两个新元素添加到此列表中而创建的

该实现几乎可以正常工作,但有一个小问题。它将在列表末尾插入“like”元素,因此您将得到如下列表:

(list 'here 'like 'be 'like 'dragons 'like)
只需在cond中添加一个额外的子句来专门处理最后一个元素,一切都应该正常工作:

(define (likenate lst)
  (cond [(empty? lst) '()]
        [(empty? (rest lst)) lst]
        [else (list* (first lst) 'like (likenate (rest lst)))]))

下面是另一个使用宏和定义语法的解决方案:

一个区别是,调用此函数时,不需要调用list函数:

比喻“这里”是龙=>这里像龙一样

(define-syntax likenate
    (syntax-rules () 
      [(_ ()) '()]      
      [(_ (e1 e2 ...)) (cons e1 (cons 'like (likenate (e2 ...))))]))