在LISP中将CHAR转换为ASCII



我想用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-codecode-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))

循序渐进:

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

最新更新