Cからlispへの変換 (ただの出力)

CをLispに変換するだけなのだけど、簡単な出力を意外と理解してないことに愕然…。基礎をおろそかにしてたなと思った次第で…。


#include <stdio.h>
#include <math.h>
main()
{
    int a,b,c ;
    scanf("%d",&a);
    scanf("%d",&b);
    scanf("%d",&c );
    printf("a = %d",a);
    printf("b = %d",b);
    printf("c = %d",c);
}


出力しようとしたら、「"」が邪魔だった。そこでprinc prin1 print を使おうと思ったら区別がついてなかった。下の実行結果はEmacsの*scratch*で「C+j」した場合の出力結果。(Common LispじゃなくてEmacs Lispです)
(progn (print "hello, world") (format "]")) 

"hello, world" ; 改行してから出力して空白が最後に付く
"]"

(progn (prin1 "hello, world") (format "]"))
"hello, world""]" ; 改行しないし最後に空白も付かない

(progn (princ "hello, world") (format "]"))
hello, world"]" ; " で括られていない
formatがちゃんと出力してくれないのが不思議。 その不思議な状況は、defunの中で、format関数の出力をした場合に出力してくれないという状況だった。

成功したコード
(defun output0320 ()
  (let (a b c)
    (setf a (read))    ;値の入力
    (setf b (read))
    (setf c (read))
    (princ "a = ")      ;値の出力
    (princ a)
    (newline)
    (princ "b = ")
    (princ b)
    (newline)
    (princ "c = ")
    (princ c)
    (newline)))

(newline)))一番右の括弧の外側でC+jを押す。
実行結果;

(output0320) ;ここでC+j
a = 1
b = 2
c = 3


失敗したソースコード。これだと変数cしか出力できない。

(defun output0320-2 ()
  (let (a b c)
    (setf a (read))
    (setf b (read))
    (setf c (read))
    (format "a = %d" a)
    (format "b = %d" b)
    (format "c = %d" c)))

実行結果;
(output0320-2)
 
"c = 3"  


*****************************

追記11/04/12

書くのを忘れてたけどこれはEmacs Lispでやっているかつ、*scratch*でやっていたから、formatだけではうまく表示されなかったんだと思う。

ここを見るとoutput0320-2でやり方でできた。


(defun output0412 ()
  (let (a b c)
    (setf a (read))
    (setf b (read))
    (setf c (read))
    (insert (format "a = %d\n" a))
    (insert (format "b = %d\n" b))
    (insert (format "c = %d\n" c))))

実行結果


(output0420)
(ミニバッファ中で1,2,3を入力すると)
a = 1
b = 2
c = 3
nil

参考サイト

http://www.geocities.jp/m_hiroi/xyzzy_lisp/abclisp07.html

http://www.gentei.org/~yuuji/elisp/elisplec.html#SEC58