LISP - Giriş ve Çıkış
Ortak LISP, çok sayıda giriş-çıkış işlevi sağlar. Biçim işlevini ve çıktı için yazdırma işlevini zaten kullandık. Bu bölümde, LISP'de sağlanan en sık kullanılan giriş-çıkış işlevlerinden bazılarına bakacağız.
Giriş Fonksiyonları
Aşağıdaki tablo, LISP'nin en sık kullanılan giriş işlevlerini göstermektedir -
Sr.No. | İşlev ve Açıklama |
---|---|
1 | read& isteğe bağlı girdi akışı eof-error-p eof-value recursive-p Giriş akışından bir Lisp nesnesinin basılı temsilini okur, karşılık gelen bir Lisp nesnesi oluşturur ve nesneyi döndürür. |
2 | read-preserving-whitespace& isteğe bağlı yayın içi eof-error-p eof-value recursive-p Genişletilmiş belirteci tam olarak hangi karakterin sonlandırdığını belirlemenin istendiği bazı özel durumlarda kullanılır. |
3 | read-line& isteğe bağlı girdi akışı eof-error-p eof-value recursive-p Bir satırsonu ile biten bir metin satırında okur. |
4 | read-char& isteğe bağlı girdi akışı eof-error-p eof-value recursive-p Girdi akımından bir karakter alır ve onu bir karakter nesnesi olarak döndürür. |
5 | unread-char karakter ve isteğe bağlı giriş akışı Giriş akışından en son okunan karakteri giriş akışının önüne koyar. |
6 | peek-char& isteğe bağlı gözetleme tipi girdi akışı eof-error-p eof-value recursive-p Girdi akışından okunacak bir sonraki karakteri girdi akışından çıkarmadan döndürür. |
7 | listenve isteğe bağlı giriş akışı Yüklem listen giriş akışından hemen elde edilebilen bir karakter varsa doğrudur, yoksa yanlıştır. |
8 | read-char-no-hang& isteğe bağlı girdi akışı eof-error-p eof-value recursive-p Benzer read-char, ancak bir karakter almazsa, bir karakteri beklemez, hemen sıfır döndürür. |
9 | clear-inputve isteğe bağlı giriş akışı Giriş akışıyla ilişkili tüm tamponlu girdileri temizler . |
10 | read-from-string dize ve isteğe bağlı eof-error-p eof-değeri & anahtar: başlangıç: bitiş: beyaz-boşluğu koru Dizinin karakterlerini art arda alır ve bir LISP nesnesi oluşturur ve nesneyi döndürür. Ayrıca, duruma göre dizedeki okunmayan ilk karakterin dizinini veya dizenin uzunluğunu (veya uzunluk +1) döndürür. |
11 | parse-integer string & key: start: end: radix: gereksiz yere izin verilir Start ve: end ile ayrılmış dizenin alt dizesini inceler (dizenin varsayılan başlangıcı ve sonu). Boşluk karakterlerini atlar ve ardından bir tamsayıyı ayrıştırmaya çalışır. |
12 | read-byte ikili giriş akışı ve isteğe bağlı eof-error-p eof-değeri İkili giriş akışından bir bayt okur ve onu bir tamsayı biçiminde döndürür. |
Klavyeden Giriş Okuma
readişlevi klavyeden giriş almak için kullanılır. Herhangi bir tartışma gerektirmeyebilir.
Örneğin, kod parçacığını düşünün -
(write ( + 15.0 (read)))
Kullanıcının STDIN Girişinden 10.2 girdiğini varsayalım,
25.2
Okuma işlevi, bir giriş akışındaki karakterleri okur ve bunları Lisp nesnelerinin temsilleri olarak ayrıştırarak yorumlar.
Misal
Main.lisp adlı yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın -
; 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)
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
Enter Radius: 5 (STDIN Input)
Area: 78.53999
Misal
Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.
(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)
)
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
#\W
#\e
#\l
#\c
#\o
#\m
#\e
#\Space
#\t
#\o
#\Space
Çıktı Fonksiyonları
LISP'deki tüm çıktı işlevleri , çıktının gönderildiği çıktı akışı adı verilen isteğe bağlı bir bağımsız değişken alır . Belirtilmediyse veya sıfırsa, çıktı akışı varsayılan olarak * standart çıktı * değişkeninin değerine ayarlanır.
Aşağıdaki tablo, LISP'nin en sık kullanılan çıktı işlevlerini göstermektedir -
Sr.No. | İşlev ve Açıklama |
---|---|
1 | write nesne ve anahtar: akım: kaçış: radix: taban: daire: güzel: seviye: uzunluk: durum: gensym: dizi write nesne ve anahtar: akım: kaçış: radix: taban: daire: güzel: seviye: uzunluk: durum: gensym: dizi: okunabilir: sağ kenar boşluğu: miser-genişlik: satırlar: pprint-dispatch Her ikisi de nesneyi: stream tarafından belirtilen çıkış akışına yazar, bu da varsayılan olarak * standard-output * değerine ayarlanır. Diğer değerler varsayılan olarak yazdırma için karşılık gelen global değişkenlere ayarlanır. |
2 | prin1 nesne ve isteğe bağlı çıktı akışı print nesne ve isteğe bağlı çıktı akışı pprint nesne ve isteğe bağlı çıktı akışı princ nesne ve isteğe bağlı çıktı akışı Tüm bu işlevler, nesnenin basılı temsilini çıktı akışına çıkarır . Ancak, aşağıdaki farklılıklar var -
|
3 | write-to-string nesne ve anahtar : kaçış: radix: taban: daire: güzel: seviye: uzunluk: durum: gensym: dizi write-to-string nesne ve anahtar: kaçış: radix: taban: daire: güzel: seviye: uzunluk: durum: gensym: dizi: okunabilir: sağ kenar boşluğu: miser-genişlik: satırlar: pprint-dispatch prin1-to-string nesne princ-to-string nesne Nesne etkin bir şekilde yazdırılır ve çıktı karakterleri döndürülen bir dizge haline getirilir. |
4 | write-char karakter ve isteğe bağlı çıktı akışı Çıktı akışına karakteri çıkarır ve karakteri döndürür. |
5 | write-string dize ve isteğe bağlı çıkış akışı & anahtar: başlangıç: bitiş Bu bir Belirtilen altdizgenin karakterleri yazar dize kadar çıktı-stream. |
6 | write-line dize ve isteğe bağlı çıkış akışı & anahtar: başlangıç: bitiş Yazma dizesi ile aynı şekilde çalışır, ancak daha sonra yeni bir satır çıkarır. |
7 | terprive isteğe bağlı çıktı akışı Çıkış akışına yeni bir satır çıkarır . |
8 | fresh-lineve isteğe bağlı çıktı akışı yalnızca akım bir satırın başlangıcında değilse bir satırsonu çıkarır. |
9 | finish-outputve isteğe bağlı çıktı akışı force-outputve isteğe bağlı çıktı akışı clear-outputve isteğe bağlı çıktı akışı
|
10 | write-byte tamsayı ikili çıkış akışı Tamsayının değerini bir bayt yazar . |
Misal
Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.
; 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)
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
Enter Number : 3456.78 (STDIN Input)
The Number: 3456.78
The Number Doubled: 6913.56
Biçimlendirilmiş Çıktı
İşlev formatgüzel biçimlendirilmiş metin üretmek için kullanılır. Aşağıdaki sözdizimine sahiptir -
format destination control-string &rest arguments
nerede,
- hedef standart çıktıdır
- control-string, çıktısı alınacak karakterleri ve baskı direktifini tutar.
Bir format directive yaklaşık işareti (~), virgülle ayrılmış isteğe bağlı önek parametreleri, isteğe bağlı iki nokta (:) ve at-işareti (@) değiştiricileri ve bunun ne tür bir yönerge olduğunu gösteren tek bir karakterden oluşur.
Önek parametreleri genellikle tamsayılardır ve isteğe bağlı olarak işaretli ondalık sayılar olarak belirtilir.
Aşağıdaki tablo, yaygın olarak kullanılan direktiflerin kısa açıklamasını sağlar -
Sr.No. | Yönerge ve Açıklama |
---|---|
1 | ~A Ardından ASCII bağımsız değişkenleri gelir. |
2 | ~S Ardından S-ifadeleri gelir. |
3 | ~D Ondalık argümanlar için. |
4 | ~B İkili argümanlar için. |
5 | ~O Sekizlik argümanlar için. |
6 | ~X Onaltılık argümanlar için. |
7 | ~C Karakter argümanları için. |
8 | ~F Sabit biçimli kayan noktalı argümanlar için. |
9 | ~E Üstel kayan nokta argümanları. |
10 | ~$ Dolar ve kayan nokta argümanları. |
11 | ~% Yeni bir satır yazdırılır. |
12 | ~* Sonraki argüman yok sayılır. |
13 | ~? Dolaylı. Sonraki bağımsız değişken bir dizge ve ondan sonraki bağımsız değişken bir liste olmalıdır. |
Misal
Bir çemberin alanını hesaplayan programı yeniden yazalım -
Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.
(defun AreaOfCircle()
(terpri)
(princ "Enter Radius: ")
(setq radius (read))
(setq area (* 3.1416 radius radius))
(format t "Radius: = ~F~% Area = ~F" radius area)
)
(AreaOfCircle)
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
Enter Radius: 10.234 (STDIN Input)
Radius: = 10.234
Area = 329.03473