需要帮助理解 BSL (DrRacket) 中的功能

Need help understanding function in BSL (DrRacket)

语言 BSL - DrRacket(球拍变体)

问题:我需要了解下面的函数到底做了什么。具体是子串位,我不明白它是如何判断一个字符串是否有“?”的最后选择是否追加“?”到消耗的字符串。

(define (ensure-question str)
  (if (string=? (substring str (- (string-length str) 1)) "?")
      str
      (string-append str "?")))

(substring s position) 函数 returns 从某个位置开始的字符串 s 的子串。例如 : (substring "Apple" 1) returns "pple" 因为我们从第一个字符开始下标。

(substring "Apple" ( - (string-length "Apple") 1))

将 return "e".

我们采用仅包含最后一个字符 (- (string-length str) 1)) 的下标,并使用函数 string=? 检查它是否等于 "?"