Lisp-input-output

提供:Dev Guides
移動先:案内検索

LISP-入力および出力

Common LISPは、多数の入出力機能を提供します。 すでにformat関数とprint関数を出力に使用しています。 このセクションでは、LISPで提供される最も一般的に使用される入出力関数のいくつかを見ていきます。

入力機能

次の表は、LISPの最も一般的に使用される入力関数を示しています-

Sr.No. Function & Description
1
  • read *& optional input-stream eof-error-p eof-value recursive-p

入力ストリームからLispオブジェクトの印刷された表現を読み込み、対応するLispオブジェクトを構築し、オブジェクトを返します。

2
  • read-preserving-whitespace *& optional in-stream eof-error-p eof-value recursive-p

これは、拡張トークンを終了した文字を正確に判別することが望ましい特殊な状況で使用されます。

3
  • read-line *& optional input-stream eof-error-p eof-value recursive-p

改行で終わるテキスト行を読み取ります。

4
  • read-char *& optional input-stream eof-error-p eof-value recursive-p

入力ストリームから1文字を取得し、文字オブジェクトとして返します。

5
  • unread-char *character & optional input-stream

入力ストリームから最後に読み込まれた文字を入力ストリームの前面に配置します。

6
  • peek-char *& optional peek-type input-stream eof-error-p eof-value recursive-p

入力ストリームから実際に削除せずに、入力ストリームから読み取られる次の文字を返します。

7
  • listen* & optional input-stream

input-streamからすぐに使用できる文字がある場合、述語 listen はtrueで、ない場合はfalseです。

8

read-char-no-hang & optional input-stream eof-error-p eof-value recursive-p

これは read-char と似ていますが、文字を取得しない場合、文字を待たずにすぐにnilを返します。

9
  • clear-input *& optional input-stream

_input-stream._に関連付けられたバッファリングされた入力をクリアします

10
  • read-from-string *string & optional eof-error-p eof-value & key :start :end :preserve-whitespace

文字列の文字を連続して取得し、LISPオブジェクトを構築してオブジェクトを返します。 また、場合によっては、読み取られていない文字列の最初の文字のインデックス、または文字列の長さ(または長さ+1)も返します。

11
  • parse-integer *string & key :start :end :radix :junk-allowed

:startと:endで区切られた文字列の部分文字列を調べます(デフォルトは文字列の先頭と末尾です)。 空白文字をスキップし、整数の解析を試みます。

12
  • read-byte* binary-input-stream & optional eof-error-p eof-value

binary-input-streamから1バイトを読み取り、整数の形式で返します。

キーボードからの入力の読み取り

*read* 関数は、キーボードから入力を取得するために使用されます。 引数をとらない場合があります。

たとえば、コードスニペットを考慮してください-

(write ( + 15.0 (read)))

ユーザーがSTDIN入力から10.2を入力すると、それが返され、

25.2

read関数は、入力ストリームから文字を読み取り、Lispオブジェクトの表現として解析することで文字を解釈します。

main.lispという名前の新しいソースコードファイルを作成し、その中に次のコードを入力します-

; the function AreaOfCircle
; calculates area of a circle
; when the radius is input from keyboard

(defun AreaOfCircle()
(terpri)
(princ "Enter Radius: ")
(setq radius (read))
(setq area (* 3.1416 radius radius))
(princ "Area: ")
(write area))
(AreaOfCircle)

あなたがコードを実行すると、それは次の結果を返します-

Enter Radius: 5 (STDIN Input)
Area: 78.53999

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

(with-input-from-string (stream "Welcome to Tutorials Point!")
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (read-char stream))
   (print (peek-char nil stream nil 'the-end))
   (values)
)

あなたがコードを実行すると、それは次の結果を返します-

#\W
#\e
#\l
#\c
#\o
#\m
#\e
#\Space
#\t
#\o
#\Space

出力関数

LISPのすべての出力関数は、出力が送信される_output-streamと呼ばれるオプションの引数を取ります。 言及されていない場合、または_nil、_ output-streamはデフォルトで変数 standard-output の値になります。

次の表は、LISPの最も一般的に使用される出力関数を示しています-

Sr.No. Function and Description
1

write object & key :stream :escape :radix :base :circle :pretty :level :length :case :gensym :array

  • write* _object_&key:stream:escape:radix:base:circle:pretty:level:length:case:gensym:array:readably:right-margin:miser-width:lines:pprint-dispatch

どちらも:streamで指定された出力ストリームにオブジェクトを書き込みます。デフォルトは standard-output の値です。 他の値は、印刷用に設定された対応するグローバル変数にデフォルト設定されます。

2

prin1 object & optional output-stream

  • print* _object_&オプションの_output-stream_ *pprint* _object_&オプションの_output-stream_ *princ* _object_&オプションの_output-stream_

これらの関数はすべて、オブジェクトの出力表現を_output-stream_に出力します。 ただし、次の違いがあります-

  • prin1は、オブジェクトを値として返します。
  • printは、前に改行があり、その後にスペースが続くオブジェクトを印刷します。 オブジェクトを返します。
  • pprintは、末尾のスペースが省略されることを除き、printと同じです。 *princは、出力にエスケープ文字がないことを除いて、prin1と同じです。
3
  • write-to-string* object & key :escape :radix :base :circle :pretty :level :length :case :gensym :array

文字列への書き込み object&キー:エスケープ:基数:ベース:サークル:きれい:レベル:長さ:ケース:gensym:配列:読み取り可能:右マージン:その他の幅:ライン:pprint-dispatch

  • prin1-to-string* _object_ *princ-to-string* _object_

オブジェクトは効果的に印刷され、出力文字は文字列に変換されて返されます。

4
  • write-char *character & optional output-stream

文字を_output-stream、_に出力し、文字を返します。

5
  • write-string *string & optional output-stream & key :start :end

_string_の指定された部分文字列の文字を_output-stream._に書き込みます。

6
  • write-line *string & optional output-stream & key :start :end

write-stringと同じように機能しますが、その後に改行を出力します。

7
  • terpri *& optional output-stream

_output-stream._に改行を出力します

8
  • fresh-line *& optional output-stream

ストリームが行の先頭にない場合にのみ、改行を出力します。

9
  • finish-output* & optional output-stream

    *force-output* &オプションの_output-stream_
    *clear-output* &オプションの_output-stream_
  • 関数 finish-output は、output-streamに送信されたすべての出力が宛先に到達したことを確認しようとし、その後にのみnilを返します。

  • 関数 force-output は、内部バッファーの空化を開始しますが、完了または確認を待たずにnilを返します。

  • 関数 clear-output は、出力を可能な限り少なくして宛先に継続できるように、進行中の未処理の出力操作を中止しようとします。

10

write-byte integer binary-output-stream

_integer._の値である1バイトを書き込みます

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

; this program inputs a numbers and doubles it
(defun DoubleNumber()
   (terpri)
   (princ "Enter Number : ")
   (setq n1 (read))
   (setq doubled (* 2.0 n1))
   (princ "The Number: ")
   (write n1)
   (terpri)
   (princ "The Number Doubled: ")
   (write doubled)
)
(DoubleNumber)

あなたがコードを実行すると、それは次の結果を返します-

Enter Number : 3456.78 (STDIN Input)
The Number: 3456.78
The Number Doubled: 6913.56

フォーマットされた出力

関数 format は、適切にフォーマットされたテキストを生成するために使用されます。 次の構文があります-

format destination control-string &rest arguments

どこで、

  • 宛先は標準出力です
  • control-stringは、出力される文字と印刷ディレクティブを保持します。
  • formatディレクティブ*は、チルダ(〜)、コンマで区切られたオプションのプレフィックスパラメーター、オプションのコロン(:)およびアットマーク(@)修飾子、およびこれがどのようなディレクティブであるかを示す単一の文字で構成されます。

プレフィックスパラメータは通常、整数であり、オプションで符号付き10進数として表記されます。

次の表は、一般的に使用されるディレクティブの簡単な説明を提供します-

Sr.No. Directive & Description
1

~A

ASCII引数が後に続きます。

2

~S

S式が続きます。

3

~D

10進引数の場合。

4

~B

バイナリ引数用。

5

~O

8進引数の場合。

6

~X

16進引数の場合。

7

~C

文字引数用。

8

~F

固定形式の浮動小数点引数の場合。

9

~E

指数浮動小数点引数。

10

~$

ドルと浮動小数点の引数。

11

~%

新しい行が印刷されます。

12

~*

次の引数は無視されます。

13

~?

間接。 次の引数は文字列で、その後の引数はリストでなければなりません。

円の面積を計算するプログラムを書き直しましょう-

main.lispという名前の新しいソースコードファイルを作成し、次のコードを入力します。

(defun AreaOfCircle()
   (terpri)
   (princ "Enter Radius: ")
   (setq radius (read))
   (setq area (* 3.1416 radius radius))
   (format t "Radius: = ~F~% Area = ~F" radius area)
)
(AreaOfCircle)

あなたがコードを実行すると、それは次の結果を返します-

Enter Radius: 10.234 (STDIN Input)
Radius: = 10.234
Area = 329.03473