• ベストアンサー

LISPのブロック?処理?

LISPで (if (条件) (真の処理) (偽の処理) )のうち、 真の処理には1つの関数?しか、書けないのでしょうか? (if (条件) (setq x "○") (setq x "×") ) ======A====== 複数関数書きたい。 Aの部分は(progn ...)とするのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

>Aの部分は(progn ...)とするのでしょうか? そう。

関連するQ&A

  • lispのwhile

    lispの特殊形式whileを以下のように定義します。 (while 判定条件 本体…) 第一引数である判定条件を評価し真ならば本体を評価しもういちど判定条件を評価、偽ならば本体を評価しない。 この時次のコードでよくわからない部分があります (defmacro image (var list &rest forms) `(let (($list$ ,list) ($r$ nil) (,var nil) ) (while ($list$ (nreverse $r$)) (setq ,var (pop $list$)) (push (progn ,@forms) r) ))) ($list$ (nreverse $r$)) この文は 偽(つまりnil) になりえるのですか? $list$はpopを繰り返すのでループを繰り返せばnilになるでしょう。 しかし (nreverse $r$) はpushを繰り返すのでnilにはなりえないと思います。 また、もしnilになりえたとしても (while (nil nil)) は (while (nil)) と同値なのでしょうか? ちなみにこれはlispの参考書のコードそのままです。 読み進めていくうちにだんだん難しくなってきました。 もうどれだけ考えてもわからないので、気持ち悪い思いはしながらもどんどん先に進んでいます。 こんな勉強法でいいんでしょうか? 不安になります。

  • LISPで連想配列の操作?

    (setq ary '((A . 1) (B . 2) (C . 3))) で、perlでの $ary{'A'}++; や $ary{'B'}='X' や $ary{'C'}=$ary{'A'}+5; ということをさせたいのですが、LISPではどう書くのでしょうか? (assoc 'A ary) 2 (assoc 'B ary) X (assoc 'C ary) 7 という結果が欲しいです。 また、一度にaryの内容を表示させる Data::DumperのようなものはLISPにあるのでしょうか? 処理系はCommon LISPです。

  • Lispにおける最大値関数

    Lispで括弧の入れ子の中身も含めた最大値を求める関数を自分なりに作ったのですが、条件によってはうまくいきません。 なぜだか教えていただけないでしょうか? (defun max1 (n) (cond ((atom n) n) (t (if (null (cdr n)) (max1 (car n)) (progn (let ((local_max (max1 (cdr n)))) (if (> (car n) local_max) (car n) local_max))))))) > (max1 '(1 2 6 (3 4))) 6 > (max1 '(1 2 (6) ((3 4)))) >: (6) is not a REAL

  • LISPの間違いを指摘して欲しいのですが・・・

    (setq a 1) (setq b 2) (setq c 3) (setq d 4) (setq e 5) (setq f 6) (setq g 7) (setq h 8) (setq i 9) (setq j 10) (defun wa(q r s t u v w x y z) (+ q r s t u v w x y z)) (wa a b c d e f g h i j ) 55 1から10までの合計値を求める”LISP”のプログラムを作りたいのですが上記を作ってみましたがうまくいきません。 どこが悪いのでしょうか?

  • lispに関する質問

    最近lispを勉強し始めたのですが、 Newton法を使った平方根を求めるプログラムがうまく書けず困っています。 (defun isqrt(n &aux x0 x1) (setq x0 (expt 2 (floor (integer-length n) 2))) (loop (setq x1 (floor (+ x0 (floor n x0)) 2)) (print x1) (cond ((= x0 x1)(return)) (t (setq x0 x1)))) x0) このように書くとnの値が3や8や15の時にx0、x1の値が無限に出てきてしまいます。 何でおかしいのでしょうか? 直すにはどうしたら良いですか? わかる方教えて下さい。 よろしくお願いします。

  • Lisp

    Lisp 今リリカルLispをやっているのですが、 詰まってしまって答えがないので困っています。 問題は (s n)を評価すると1+2+・・・+nが返るように関数をsiを定義する(ただしsは次のように定義されている define (s n) (si n 0) ) という問題です。 一応自分なりに考えたのが (define si (lambda (n x) (if (= n 1) (x) (si (- n 1) (+ n x))))) なんですが無限ループのようになるのかこれを実行すると固まって落ちてしまいます。 ご指摘よろしくお願いします。

  • lispについて質問です

    assoc関数と同じ動作をする関数(ただし、文字列も扱えるようにする)を作成したいと考えています 具体的には、 (setq S '(("1" "a")("2" "b"))) とあったときに、自作した関数(assoc_mojiとします) (assoc_moji "1" S) と実行したら ("1" "a") となるような関数です また、無い場合はnilを返します 条件分岐で関数を組み込み、成功した場合は結果を返し そのほかの場合はnilを返すというところまではわかりますが、 その条件分岐で定義する式が全くわかりません。 memberや、equalを使って、リストに含まれていれば、または指定した文字列が一緒ならば、返すなどしましたがまったくうまくいきませんでした。 どなたか、こういう関数を使ってこういう処理をさせればよいという風なヒントだけでもいいので、ご教授お願いします

  • Lispについてわからないことが(Scheme)

    あるLispの勉強ソフトで、 「関数lを『引数としてxを受け取ると、xの要素の数を返す関数』として定義しなさい。」 という問題があるのですが、私は以下のようにしました。 (define l (lambda (x) (if (= x null?) 0 (+ 1 (l (cdr x)))))) しかしこれだとオーバーフローと表示されて強制終了されてしまいました。 そこで答えをネットで検索したところ以下のものが見つかりました。 (define l (lambda (x) (cond ((null? x) 0) (else (+ 1 (l (cdr x))))))) これが正解なようですが、この2つのリストの違いがわかりません。 初歩的なことですがifの使い方を間違っているんでしょうか?

  • emacs lispで別のバッファを制御する方法

    emacs lispのプログラミングをしていて、現在のバッファにあるファイル名と行番号を取得して別のwindowにそのファイルのその行を表示させたいのですが、以下の様にしてファイルのオープンは出来るのですが行の移動が出来ません。どの様にしたら良いのでしょうか? ------------------------ (defun elx-display-source () (interactive) (elx-link-to-source) ; <--この関数でfile-nameとline-noに値がセットされる (setq log-buffer (current-buffer)) <-- 今のバッファ ( if file-name (progn (setq rtl-buffer (find-file-noselect file-name)) <-- 新しいファイルを開く(OK) (display-buffer rtl-buffer) ; (switch-to-buffer rtl-buffer) ; (goto-line line-no) ; <-- ここで行をジャンプさせたいがしない。。。 (switch-to-buffer log-buffer))) ) ---------------------

  • MSExcel2003で条件分岐の方法

    今まで、条件AまたはBである時は真・それ以外は偽を返す式を作るとき =if(A1="A","真",if(A1="B","真","偽")) という式を作ってきました。これをor記号を使って =if(A="A"or"B","真","偽") というように作り替えたいのですが,うまくいきません。 今は二つの条件に合わない場合は偽としていますが、これが 5つくらいになってくるとこの方法補煩雑で間違いが多くなり使えないのですが、 どうすれば上手な条件分岐をすることができますか?