LISP-入力と出力

Common LISPは、多数の入出力機能を提供します。すでにフォーマット機能とプリント機能を出力に使用しています。このセクションでは、LISPで提供される最も一般的に使用される入出力関数のいくつかを調べます。

入力関数

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

シニア番号 機能と説明
1

read&オプションの入力ストリームeof-error-p eof-value recursive-p

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

2

read-preserving-whitespace&オプションのインストリームeof-error-p eof-value recursive-p

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

3

read-line&オプションの入力ストリームeof-error-p eof-value recursive-p

改行で終了するテキスト行を読み込みます。

4

read-char&オプションの入力ストリームeof-error-p eof-value recursive-p

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

5

unread-char 文字とオプションの入力ストリーム

入力ストリームから最後に読み取られた文字を、入力ストリームの先頭に配置します。

6

peek-char&オプションのピークタイプの入力ストリームeof-error-p eof-value recursive-p

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

7

listen&オプションの入力ストリーム

述語 listen 入力ストリームからすぐに使用できる文字がある場合はtrue、そうでない場合はfalseです。

8

read-char-no-hang&オプションの入力ストリームeof-error-p eof-value recursive-p

に似ています read-char、ただし、文字を取得しない場合は、文字を待機せず、すぐにnilを返します。

9

clear-input&オプションの入力ストリーム

input-streamに関連付けられているバッファリングされた入力をすべてクリアします。

10

read-from-string 文字列とオプションのeof-error-peof-value&key:start:end:preserve-whitespace

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

11

parse-integer 文字列とキー:start:end:radix:junk-許可

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

12

read-byte バイナリ入力ストリームとオプションのeof-error-peof-value

バイナリ入力ストリームから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の最も一般的に使用される出力関数を示しています-

シニア番号 機能と説明
1

write オブジェクトとキー:stream:escape:radix:base:circle:pretty:level:length:case:gensym:array

write オブジェクトとキー:stream:escape:radix:base:circle:pretty:level:length:case:gensym:array:readably:right-margin:miser-width:lines:pprint-dispatch

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

2

prin1 オブジェクトとオプションの出力ストリーム

print オブジェクトとオプションの出力ストリーム

pprint オブジェクトとオプションの出力ストリーム

princ オブジェクトとオプションの出力ストリーム

これらの関数はすべて、オブジェクトの印刷表現をoutput-stream出力します。ただし、以下の違いがあります-

  • prin1は、オブジェクトをその値として返します。

  • printは、前に改行があり、その後にスペースが続くオブジェクトを印刷します。オブジェクトを返します。

  • pprintは、末尾のスペースが省略されていることを除いて、printと同じです。

  • princは、出力にエスケープ文字がないことを除いて、prin1と同じです。

3

write-to-string オブジェクトとキー:escape:radix:base:circle:pretty:level:length:case:gensym:array

write-to-string オブジェクトとキー:escape:radix:base:circle:pretty:level:length:case:gensym:array:readably:right-margin:miser-width:lines:pprint-dispatch

prin1-to-string オブジェクト

princ-to-string オブジェクト

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

4

write-char 文字とオプションの出力ストリーム

It outputs the character to output-stream, and returns character.

5

write-string string & optional output-stream & key :start :end

It writes the characters of the specified substring of string to the output-stream.

6

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

It works the same way as write-string, but outputs a newline afterwards.

7

terpri & optional output-stream

It outputs a newline to output-stream.

8

fresh-line & optional output-stream

it outputs a newline only if the stream is not already at the start of a line.

9

finish-output & optional output-stream

force-output & optional output-stream

clear-output & optional output-stream

  • The function finish-output attempts to ensure that all output sent to output-stream has reached its destination, and only then returns nil.

  • The function force-output initiates the emptying of any internal buffers but returns nil without waiting for completion or acknowledgment.

  • The function clear-output attempts to abort any outstanding output operation in progress in order to allow as little output as possible to continue to the destination.

10

write-byte integer binary-output-stream

It writes one byte, the value of the integer.

Example

Create a new source code file named main.lisp and type the following code in it.

; 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)

When you execute the code, it returns the following result −

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

Formatted Output

The function format is used for producing nicely formatted text. It has the following syntax −

format destination control-string &rest arguments

where,

  • destination is standard output
  • control-string holds the characters to be output and the printing directive.

A format directive consists of a tilde (~), optional prefix parameters separated by commas, optional colon (:) and at-sign (@) modifiers, and a single character indicating what kind of directive this is.

The prefix parameters are generally integers, notated as optionally signed decimal numbers.

The following table provides brief description of the commonly used directives −

Sr.No. Directive & Description
1

~A

Is followed by ASCII arguments.

2

~S

Is followed by S-expressions.

3

~D

For decimal arguments.

4

~B

For binary arguments.

5

~O

For octal arguments.

6

~X

For hexadecimal arguments.

7

~C

For character arguments.

8

~F

For Fixed-format floating-point arguments.

9

~E

Exponential floating-point arguments.

10

~$

Dollar and floating point arguments.

11

~%

A new line is printed.

12

~*

Next argument is ignored.

13

~?

Indirection. The next argument must be a string, and the one after it a list.

Example

Let us rewrite the program calculating a circle's area −

Create a new source code file named main.lisp and type the following code in it.

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

When you execute the code, it returns the following result −

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