[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp: if, and, cond



 r高橋です。

Reply TAKAHASHI Naoto <ntakahas@...>'s message:

} す。defun の直前の開き括弧の上にカーソルを置いて M-q とすると自動的に
} インデントされますが、それが Emacs のおすすめ indentation です。

 うわっ、これ便利ですね! Emacsって賢い……。
自分で書いているときは、その都度インデントするとわかりやすいのですが、途
中でぐちゃぐちゃになってきたりもしそうなので、「おすすめ」があると安心で
す。

} marker っていうのはバッファ内の位置を示すためのものです。普通、バッファ
} 内の位置は整数で表します。たとえば (char-after 1) とすると、現在のバッ
} ファの先頭の文字が返され、(char-after 100) とすると先頭から100番目の文
} 字が返されます。
} 
} まあ普通はこれでいいんですが、ここでたとえば50番目の文字を消したりする
} と、(char-after 100) は以前101番目だった文字を返すことになります。とこ
} ろが場合によっては、途中で挿入や削除があっても最初に100番目だった場所
} を常にトレースしたい場合があります。marker はそういう時に使います。
} marker を作ってそれにバッファ内の位置を束縛(代入)すると、間に挿入や削
} 除があっても marker の示す位置は自動的に調整されるようになります。
} 
} わからなかったら、とりあえずは忘れていいと思います。(^_^)

 あやっ、まためんどうなことを訊いてしまったんですね。わかりやすい解説を
ありがとうございます! そういう機能もあるんだ、ということがわかってよか
ったです。文章とか文字列(?)の操作には、すごく関心があります。

} >  これも、「ずるい」tっぽい? もう絶対に t だとわかっているので、なんと
} > 条件式のところに、最初から t を入れてしまう、ということですよね。
} 
} 単に言葉使いの問題かもしれませんが、「もう絶対に t だとわかっている」
} というと消極的な感じがします。むしろ、「プログラマである俺様がこれ以降
} は全部こうすることに決めたんだ」という主張だと考えた方がいいかもしれま
} せん。

 あっ、そうですよね。でも、私なんかだと、ほんとうは間違っているのに「プ
ログラマである俺様が……」とか言ってしまいそうです。でもでも、返す値を「
明示的に」決めてしまってもいいんだ、ということはわかりました。

} >  「cond の条件の最後が t でなく」というのは、「nil だったら」という意味
} > ですか?
} 
} 違います。たとえばこんな例を考えます。
} 
} (defun season (n)
}   (cond
}    ((not (integerp n))
}     (print "Argument must be an integer")
}     nil)
}    ((= n 1) 'spring)
}    ((= n 2) 'summer)
}    ((= n 3) 'autumn)
}    ((= n 4) 'winter)))
} 
} 最初の (not (integerp n)) は fact の場合同様、整数かどうかのチェックで
} す。それより後ろは、1〜4の引数を春夏秋冬に変換する部分です。ここで最後
} の条件が t になっていません。ですから引数として1〜4以外の整数を与える
} とマッチする条件が一つもないことになります。この場合 cond は nil を返
} しますから、season の値も nil になります。
} 
} もし最後の行を
}  
}    (t 'winter)))
} 
} に変えると、1〜3以外の引数は全部 winter になります。違いがおわかりでしょ
} うか。

 わかりました! (cond ...)の条件には、「例外」といっても、「〜〜じゃな
かったら」という形だけではなくて、「〜〜だったら」という特別な場合(だか
らやっぱり例外)が入れられるんですね。あたりまえのことで、表面的にはわか
っていたはずなのですが、ちゃんと飲み込めていませんでした。

 今回考えてしまったのは、
   ((= n 1) 'spring)
   ((= n 2) 'summer) ...
の部分でした。これは、「文字列」ではなくて、「シンボル」を返していますよ
ね。
こういうときは、文字列よりシンボルを使うのが普通なのでしょうか?
たしかに、文字列にするとダブルクオートが付いてしまってじゃまなのですが、
なんだかシンボルを文字列代わりに使っている感じで不思議です。


**-***-***-***-***-***-***-***-***-***-***-***-**
           Reiko TAKAHASHI  (高橋玲子)
         E-mail:  HFC03614@...
         ICQ UIN: 85924121  (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**