-1

我想在 LISP 中编写一个程序来从用户那里获取一个字符串,并返回通过将 1 加到字符串的每个字符代码而形成的字符串。例如:

输入:“hello123” 输出:“ifmmp234”

我想也许我应该将字符一一转换为ASCII,然后做我想做的事。

对此的任何帮助将不胜感激..

谢谢

这是我开发的代码。然而,它在输出中给了我 NIL 。你能帮我解决这个问题吗:

(defun esi (n)
  (setf m 0)
  (loop (when (< m (length n))
          (return))
        (code-char (+ 1 (char-code (char n m))))
        (+ 1 m))) 
4

2 回答 2

4

看看函数char-codecode-char

编辑:关于您的代码示例:

  • 您的函数的输入似乎应该是一个字符串。这样命名,例如string
  • (setf m 0)就是设置一个自由变量。在这种情况下,我必须假设m从未在任何地方定义过,因此行为是未定义的。例如,您应该使用let来建立本地绑定。提示:大多数循环结构也提供了建立本地绑定的方法。
  • 唯一退出循环的是(return). 由于它没有获取任何参数,因此它将始终返回nil. 您需要在某处累积新字符串并最终返回它。
  • Lisp 中的函数大多不修改它们的参数。 (+ 1 m)不修改m。它只返回一个大于 1 的值m。同样,code-char不会修改其参数,而是返回一个新值,即与参数对应的字符。您需要绑定或分配这些值。
  • 那个完成条件是错误的。它将直接终止,或者如果输入字符串为空,则永远不会终止。
于 2012-07-14T13:36:54.500 回答
1

有很多方法可以做你想做的事。让我们从一个函数开始,它在一个代码点之后返回一个字符(这里有一些边界问题,我们暂时忽略它)。

(defun next-codepoint (char) (code-char (1+ (char-code char))))

现在,这对字符起作用。令人高兴的是,字符串本质上是一个字符序列。一般来说,序列操作应该将您发送到 MAP 系列的方向。

所以,我们有:

(defun nextify-string (string) (map 'string #'next-codepoint string))

逐步了解正在发生的事情:

  • 对于输入字符串 m 中的每个字符,我们执行以下操作:
    • 我们将字符转换为代码属性。
    • 我们增加这个
    • 我们将它转​​换回一个字符
  • 然后我们将所有这些组合成一个返回值。
于 2012-07-15T14:20:16.293 回答