我想用LISP编写一个程序,从用户那里获得一个字符串,并返回字符串的每个字符代码加1后形成的字符串。例如:
输入:"hello123"输出:"ifmmp234"
我想也许我应该把字符一个接一个地转换成ASCII,然后做我想做的事。
如有任何帮助,我们将不胜感激。。
感谢
这是我开发的代码。然而,它在输出中给了我零。你能帮我吗:
(defun esi (n)
(setf m 0)
(loop (when (< m (length n))
(return))
(code-char (+ 1 (char-code (char n m))))
(+ 1 m)))
查看函数char-code
和code-char
。
编辑:关于您的代码示例:
- 函数的输入似乎应该是一个字符串。这样命名,例如
string
(setf m 0)
正在设置一个自由变量。在这种情况下,我必须假设m
从未在任何地方定义过,因此行为是未定义的。例如,您应该使用let
来建立本地绑定。提示:大多数循环结构还提供了建立本地绑定的方法- 循环中唯一的出口是
(return)
。由于它没有得到任何参数,它将始终返回nil
。您需要将新字符串累积到某个位置,然后最终返回 - Lisp中的函数大多不修改它们的参数。
(+ 1 m)
不修改m
。它只是返回一个比m
大一的值。同样,code-char
不会修改其参数,而是返回一个新值,该值是与该参数对应的字符。您需要绑定或分配这些值 - 这种收尾条件是错误的。它将直接终止,或者,如果输入字符串为空,则从不终止
有很多方法可以满足您的需求。让我们从一个函数开始,该函数在一个代码点后返回一个字符(这里有一些边界问题,我们暂时忽略它)。
(defun next-codepoint (char) (code-char (1+ (char-code char))))
现在,这对角色起作用。令人高兴的是,字符串本质上是一系列字符。一般来说,序列操作应将您发送到MAP系列的方向。
因此,我们有:
(defun nextify-string (string) (map 'string #'next-codepoint string))
循序渐进:
- 对于输入字符串中的每个字符,我们执行以下操作:
- 我们将字符转换为代码属性
- 我们增加这个
- 我们将其转换回字符
- 然后我们将所有这些集合为一个返回值