【问题标题】:If statement / String comparisonIf语句/字符串比较
【发布时间】:2013-02-06 22:32:07
【问题描述】:

我是elisp 的新手,我正在尝试使用if 语句编写一个简单的程序。

重点是在学年阅读并返回 12340 用于字符串 "freshman""sophomore""junior" , "senior" 分别(没有匹配时默认为0。我的代码如下:

(defun yearCode(name)
    (if ( = name "freshman") 1
      (if ( = name "sophomore") 2
        (if ( = name "junior") 3
          (if ( = name "senior") 4
            (0))))))


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;; main function                        ;;;
;;; input: year                          ;;;
;;; output: code corresponding to year   ;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun main (year)
 (interactive "sEnter your academic year: ")  ; read year
 (message "%d" (yearCode year)))              ; display its code

  ;;; Tests...
 (main "junior")
 (yearCode "junior")

老实说,我对 elisp 一无所知,所以即使编译第一部分我也遇到了麻烦。谁能帮我正确地构造一个if 语句?

编辑:我在错误的缓冲区中测试 -_- 代码使用 if 语句工作。

【问题讨论】:

  • 最后一次编辑完全改变了问题...当您传入一个不是四个预期字符串之一的字符串时,当前的yearCode 定义将失败(将= 更改为@987654337 @) 因为它有一个表达式,其中第一个元素不是函数:(0)

标签: emacs if-statement comparison elisp


【解决方案1】:

当你在 ruby​​ 中有 if..elseif..elseif..else 时,你在 emacs lisp 中使用 cond

(defun yearCode (name)
  (cond
   ((string= name "freshman") 1)
   ((string= name "sophomore") 2)
   ((string= name "junior") 3)
   ((string= name "senior") 4)))   

不过,我不会这样写。

(defun yearCode (name)
  (cdr (assoc name
              '(("freshman" . 1)
                ("sophomore" . 2)
                ("junior" . 3)
                ("senior" . 4)))))

等式有很多种,= 严格用于数字(或标记)。 string= 用于字符串和字符串 designatorseq 用于对象标识,equalelements 的一种深度相等(这就是它适用于字符串的原因,但对于字符串与非字符串比较,它只会返回 false,永远不会检测到错误)。后一个 equalassoc 使用。

【讨论】:

  • 这样做确实有效。但是有没有办法使用 if 语句?重点是比较使用所有不同语言的 if 语句的不同外观。
  • 花时间了解cond 真的很值得。您可以将其视为 if 语句的扩展,它实际上只是在简化一切!
【解决方案2】:

以最小的更改编写yearCode 的方法是:

(defun yearCode (name)
  (cond ((string= name "freshman") 1)
        ((string= name "sophomore") 2)
        ((string= name "junior") 3)
        ((string= name "senior") 4)
        (0)))

编辑添加:问题的原始版本的结构非常不同,因此下面的解释不再适用......

你写的和上面的代码不同的是,上面代码中yearCode有一个(cond)表达式,那个函数的返回值就是cond语句的返回值。

您的原始代码有 4 个不同的表达式,实际上只返回最后一个表达式的值(最后一个 if)语句 - 这意味着返回值是 4nil

我建议阅读 lisp 入门书籍,我最喜欢的是 SICP,但您可能应该查看询问 best introductory books 的 SO 问题。

【讨论】:

  • 感谢您的输入...我在错误的缓冲区中工作并且测试错误。非常感谢您提供的信息,但是从现在开始我将使用条件句:)
【解决方案3】:

这将是使用 if 语句编写它的方式。 if 语句有一个条件部分,它要么是真要么是假。如果为真,则评估 FIRST 部分。真的只能是一句话,除非你用(progn )。其余部分将是 if 语句的 else 部分。

(defun yearCode(name)
    (if (string= name "freshman")    ; true or false?
       1                            ; if true, returns 1 

  ; Note that you can't really write anything else here. 
  ; From here on, it is the first else part!

     (if (string= name "sophomore")  ; if false, else part  etc.
       2
      (if (string= name "junior") 
        3
       (if (string= name "senior") 
         4)))))

虽然这专门回答了您关于if 的问题,但我当然建议使用 cond 而不是,就像其他人建议的那样。

progn的应用下,在TRUE的情况下,有超过1个表达式被求值。

(defun yearCode(name)
    (if (string= name "freshman")    ; true or false?
       (progn 1                      ; if true, returns 1 
              (message "this is possible!"))          

     (if (string= name "sophomore")  ; if false, else part  etc.
       2
      (if (string= name "junior") 
        3
       (if (string= name "senior") 
         4)))))

【讨论】:

  • 非常感谢我想通了。谢谢你的意见:)
  • 应该强调的是,您确实想改用cond,如下面的答案所示。
  • 添加了强调
猜你喜欢
  • 2016-07-17
  • 1970-01-01
  • 2018-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多