2

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

重点是在一年的学校阅读并分别返回, , , 或字符串 , , 12默认34没有0匹配"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 语句工作。

4

3 回答 3

4

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

(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=用于字符串和字符串指示符eq用于对象标识,equal是一种元素的深度相等(这就是它适用于字符串的原因,但它只会在字符串与非字符串比较时返回 false,从不检测错误)。后一个 ,equal由 使用assoc

于 2013-02-06T22:38:01.887 回答
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)语句 - 这意味着返回值是4or nil

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

于 2013-02-06T22:37:50.370 回答
1

这将是使用 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)))))
于 2013-02-06T23:12:55.993 回答