String 创建一个函数,在开始和结束时用两个字符串覆盖一个字符串

String 创建一个函数,在开始和结束时用两个字符串覆盖一个字符串,string,scheme,racket,overwrite,String,Scheme,Racket,Overwrite,我用奇怪的语言Racket在开头和结尾用另外两个字符串覆盖一个字符串 (define overwrite (s beg end)... 例如,(覆盖“弹射器”“狗”“布拉”)应该输出“dogablah” (覆盖“greenbeans”“munk”“grub”)应输出“munknbgrub” 有时,覆盖会完全覆盖中心词: (覆盖“狗”“老鼠”“跳蚤”)应输出“鼠标飞行” 主要问题是我只能使用三个内置函数来尝试解决这个问题。(字符串长度),(子字符串)和(字符串附加) 我尝试了以下方法,但没有效果

我用奇怪的语言Racket在开头和结尾用另外两个字符串覆盖一个字符串

(define overwrite (s beg end)...
例如,
(覆盖“弹射器”“狗”“布拉”)
应该输出
“dogablah”
(覆盖“greenbeans”“munk”“grub”)
应输出
“munknbgrub”

有时,覆盖会完全覆盖中心词:
(覆盖“狗”“老鼠”“跳蚤”)
应输出
“鼠标飞行”

主要问题是我只能使用三个内置函数来尝试解决这个问题。(字符串长度),(子字符串)和(字符串附加)

我尝试了以下方法,但没有效果:

(define (overwrite s beg end)
  (string-append (substring s 0 (string-length beg)) ""
                 (substring s (- (string-length s) (string-length end))
                            (string-length s))))
我可以使用助手函数和其他基本的数学函数,但这是我以前从未做过的事情。太糟糕了,scheme/racket没有一些易于使用的替换功能。
提前谢谢!这是我能得到的最具体的

显然发现这是一个简单的答案。废话

(定义(结束时覆盖)
(字符串附加beg(子字符串s(字符串长度beg)((字符串长度s)(字符串长度结束)))结束))


我的意思是,如果有人有更好的方法,请随意分享

使用单线解决方案:

(define (overwrite s beg end)
  (string-append beg (substring s (string-length beg) (- (string-length s) (string-length end))) end)
请注意,以下操作将起作用:

(overwrite "greenbeans" "munk" "grub")
=> "munknbgrub"
但以下措施将失败:

(overwrite "dog" "mouse" "flea")
原因是,只接受非负整数作为参数。自从争论以来

(- (string-length s) (string-length end))
如果
s
的字符串长度小于
end
,例如“dog”vs“flea”,则变为负值,这将引发异常

您可以通过检查
s
的长度是否小于
beg
end
的组合长度来解决此问题,在这种情况下,您只需附加
beg
end
。例如:

(define (overwrite s beg end)
  (let ((l1 (string-length s))
        (l2 (string-length beg))
        (l3 (string-length end)))
    (if (>= (+ l2 l3) l1)
        (string-append beg end)
        (string-append beg (substring s l2 (- l1 l3)) end))))
然后你将有:

(overwrite "greenbeans" "munk" "grub")
=> "munknbgrub"
(overwrite "dog" "mouse" "flea")
=> "mouseflea"

我承认这是一个很好的答案,但是我们在分配作业后才了解了条件语句,并且被告知我们不允许在这个问题中使用条件语句。