我想在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)))
答案 0 :(得分:3)
编辑:关于您的代码示例:
string
。(setf m 0)
正在设置一个自由变量。在这种情况下,我必须假设m
永远不会在任何地方定义,因此行为是未定义的。例如,您应该使用let
来建立本地绑定。提示:大多数循环结构也提供了建立本地绑定的方法。(return)
。由于它没有获得任何参数,因此它将始终返回nil
。你需要在某处累积新字符串并最终返回它。(+ 1 m)
不会修改m
。它只返回一个大于m
的值。同样,code-char
不会修改其参数,而是返回一个新值,该值是与参数对应的字符。您需要绑定或分配这些值。答案 1 :(得分:0)
有很多方法可以做你想做的事。让我们从一个稍后返回一个代码点的函数开始(这里有一些边界问题,让我们暂时忽略它)。
(defun next-codepoint (char) (code-char (1+ (char-code char))))
现在,这对角色起作用。令人高兴的是,字符串本质上是一系列字符。通常,序列操作应该将您发送到MAP系列的方向。
所以,我们有:
(defun nextify-string (string) (map 'string #'next-codepoint string))
逐步采取措施: