Scheme 方案中参数传递的异常方式

Scheme 方案中参数传递的异常方式,scheme,Scheme,我试图在scheme中实现一个函数,它将给定的列表与作为函数参数的函数分开。举例说明: (splitby '("a" "b" "cc" "ab" "abc" "a" "b") (lambda (x y) (= (string-length x) (string-length y)))) 应返回(“a”b)(“cc”ab)(“abc”)(“a”b”) 我是Scheme的初学者,因此很难理解这个“类似函数”的参数是如何工作的,在实现这样一个函数时,我应该做什么?在Scheme中,

我试图在scheme中实现一个函数,它将给定的列表与作为函数参数的函数分开。举例说明:

(splitby '("a" "b" "cc" "ab" "abc" "a" "b")
         (lambda (x y) (= (string-length x) (string-length y))))
应返回
(“a”b)(“cc”ab)(“abc”)(“a”b”)


我是Scheme的初学者,因此很难理解这个“类似函数”的参数是如何工作的,在实现这样一个函数时,我应该做什么?

在Scheme中,函数是数字、字符串等对象。因此在本例中,您的示例相当于:

(define (equal-length x y)
  (= (string-length x) (string-length y)))

(splitby '("a" "b" "cc" "ab" "abc" "a" "b") equal-length)
函数的用途是允许自定义拆分条件。在这种情况下,只要给定函数返回真值,项目就在同一组中;否则将创建一个新组

要开始,请编写一个
groupequal
函数,将相等的元素分组在一起:

(define (group-equal lst)
  ...)
比如说

(group-equal '(1 2 2 3 3 3 4))
返回

((1) (2 2) (3 3 3) (4))

如果您成功地实现了该功能,那么它与您的
splitby
函数相同,只是您使用了给定的函数(
equal length
,例如)而不是
equal?
(正如
group equal
可能使用的那样).

首先,在Scheme中,所有内容都在括号内。因此,如果要将函数
f
应用于值
x
y
,请编写:

(f x y)
因此,您只需将
splitby
放入第一组参数中

其次,函数可以作为值传递给其他函数,就像传递数据一样。
如果我有一个函数:

(define (double x)
    (* x 2))
我可以编写另一个以
double
为参数的函数:

(define (change_result f x)
   (f (+ 3 x)))

; (change_result double 6) returns 18
如果我使用lambda(匿名)函数,也可以用同样的方法:

(change_result (lambda (x) (* 3 x)) 10)

s/change\u result/change result/g
。在Lisp风格中,标识符使用连字符分隔单词,而不是下划线。参考资料:“符号名是用连字符分隔的英语单词书写的。Scheme和CommonLisp都在程序中折叠名称的大小写;因此,骆驼案不受欢迎,不仅仅是因为它丑陋。下划线是不可接受的分隔符,除非名称直接来源于外语而没有翻译。“@ChrisJester Young-感谢您提供的信息。“折叠大小写”是什么意思?我在源代码中找不到任何线索。在CL和Scheme中(最多R5RS),标识符不区分大小写,因此
car
car
car
处理相同。这就是case folding的意思。谢谢。这是一个非常有用的答案。