【问题标题】:lisp convert to string uppercaselisp 转换为字符串大写
【发布时间】:2014-07-17 18:16:54
【问题描述】:

我想将原子转换为字符串以检查第一个字母是否为大写字母,但使用 Clisp 函数字符串返回大写字母 si 我无法将其应用于我的原子。

例子:

(setq a 'ljlkj)
(upper-case-p (char (string a)  0))     ----> returns T (and I want nil)

我做错了什么?

提前谢谢你!

【问题讨论】:

  • 为什么要检查符号名称中字符的大小写?这似乎是一件非常错误的事情!
  • 因为我有一个带有这样列表的程序:(你好,这是一个句子)并且我不想重新组织我的所有代码以拥有这样的列表:(“Hello”“it”“是“一个”“句子”),虽然我可能不得不这样做。
  • 在这种情况下,你应该在阅读你的句子之前将readtable-case设置为:preserve(它们在一个文件中,而不是穿插在你的代码中,对吧?)你也可以在你的代码中引用这些东西与|(setq a '|Hello|)
  • 实际上我得到了带有 (read-line) 的句子,所以我唯一的解决方案是重新定义 readtable :preserve 每次我阅读输入并且每次我想知道第一个字母是否是大写字母?
  • 我不确定将单词存储为符号是否是个好主意。但是如果你确定你的方法,我会定义我自己的可读变量并在我阅读句子时将*readtable*绑定到它。

标签: symbols uppercase clisp


【解决方案1】:

Common Lisp reader 默认是大小写转换 (step 7)。 这是访问者readtable-casecontrolled

 (defun test-readtable-case-reading ()
   (let ((*readtable* (copy-readtable nil)))
     (format t "READTABLE-CASE  Input   Symbol-name~
              ~%-----------------------------------~
              ~%")
     (dolist (readtable-case '(:upcase :downcase :preserve :invert))
       (setf (readtable-case *readtable*) readtable-case)
       (dolist (input '("ZEBRA" "Zebra" "zebra"))
         (format t "~&:~A~16T~A~24T~A"
                 (string-upcase readtable-case)
                 input
                 (symbol-name (read-from-string input)))))))

(test-readtable-case-reading) 的输出应该如下:

 READTABLE-CASE     Input Symbol-name
 -------------------------------------
    :UPCASE         ZEBRA   ZEBRA
    :UPCASE         Zebra   ZEBRA
    :UPCASE         zebra   ZEBRA
    :DOWNCASE       ZEBRA   zebra
    :DOWNCASE       Zebra   zebra
    :DOWNCASE       zebra   zebra
    :PRESERVE       ZEBRA   ZEBRA
    :PRESERVE       Zebra   Zebra
    :PRESERVE       zebra   zebra
    :INVERT         ZEBRA   zebra
    :INVERT         Zebra   Zebra
    :INVERT         zebra   ZEBRA

查看Why is Common Lisp case insensitive? 的出色答案,了解为什么 CL 阅读器会转换大小写。

【讨论】:

  • 感谢您的回复,我很抱歉,但是当我这样做时: (setf (readtable-case readtable) :invert) 和之后: (setq a (string 'lkj)) 我还有 LKJ
  • 当然可以。这是从上面的代码遵循的正确记录行为。试试(setq a (string LKJ))`。
  • 哎呀,是的,对不起。但是我仍然不知道一个单词的第一个字母是否是大写字母,除非我使用 :preserve,但是在此之后 lisp 函数不起作用。每次我想检查这个时重新定义 readtable-case 的唯一方法是什么?
猜你喜欢
  • 2018-09-16
  • 2010-12-03
  • 2013-10-31
  • 2018-09-07
  • 2012-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多