Scheme 方案中参数传递的异常方式
我试图在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中,
(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的意思。谢谢。这是一个非常有用的答案。