在LISP中将CHAR转换为ASCII

时间:2012-07-14 12:11:11

标签: string lisp common-lisp

我想在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))) 

2 个答案:

答案 0 :(得分:3)

查看函数char-codecode-char

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

  • 您的函数的输入似乎应该是一个字符串。将其命名为,例如string
  • (setf m 0)正在设置一个自由变量。在这种情况下,我必须假设m永远不会在任何地方定义,因此行为是未定义的。例如,您应该使用let来建立本地绑定。提示:大多数循环结构也提供了建立本地绑定的方法。
  • 循环中唯一退出的是(return)。由于它没有获得任何参数,因此它将始终返回nil。你需要在某处累积新字符串并最终返回它。
  • Lisp中的函数大多不修改它们的参数。 (+ 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))

逐步采取措施:

  • 对于输入字符串中的每个字符,我们执行以下操作:
    • 我们将字符转换为代码属性。
    • 我们增加此
    • 我们将其换回角色
  • 然后我们将所有这些组合成一个返回值。