2

私は初めてで、ステートメントelispを使用して簡単なプログラムを作成しようとしています。if

要点は、学年を読み取り、文字列、、に対して123、、4またはいずれかを返すことです (一致しない場合のデフォルトは次のとおりです。私のコードは次のとおりです。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あり、オブジェクト ID 用であり、要素equalの一種の深い等価性です(これが文字列に対して機能する理由ですが、文字列と非文字列の比較では false を返すだけで、エラーを検出することはありません)。この後者のは によって使用されます。equalassoc

于 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) 式が 1 つあり、その関数の戻り値がcondステートメントの戻り値であることです。

元のコードには 4 つの異なる式がありましたが、最後の式の値のみが実際に返されます (最後のif) ステートメント - つまり、戻り値は または のいずれ4nilです。

Lisp の入門書を読むことをお勧めします。私のお気に入りはSICPです。

于 2013-02-06T22:37:50.370 に答える
1

if文を使って書くとこうなります。if ステートメントには、true または false の条件部分があります。true の場合、FIRST 部分が評価されます。を使用しない限り、実際には 1 つの文しかありません(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

の適用の下で、prognTRUE の場合、評価される式が 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 に答える