Schemeを使用したファイルからの読み取り



Reading From File Using Scheme



解決:

テキストをインポートする最も推奨される方法は、ファイルを編集して、変数を定義するスキームファイルとして保存することです。

(データを定義します 'mydata.scmのテキストをここに')

そして呼び出します:



( 'mydata.scm'をロード)

多くの場合、すべてのデータファイルを編集してスキームファイルとして保存できるわけではありません。改行は自動的にエスケープされますが、二重引用符は使用できず、ファイルのロード時に問題が発生します。

いくつかの実装固有の手法は次のとおりです。



; Chicken(use utils)(read-all'mydata.txt '); Racket(file-> string'mydata.txt')

よりポータブルな機能は次のとおりです。

; chicken-csiおよびRacketで動作します(define(readlines filename)(call-with-input-file filename(lambda(p)(let loop((line(read-line p))(result '()))(if (eof-object?line)(reverse result)(loop(read-line p)(cons line result))))))))

実行可能でコンパイルされたchicken-cscを実行すると、読み取り行に追加のファイルが必要になるため、エラーが発生します。

ファイルを読み取る最も移植性の高い方法は、次の関数です。



; Chicken、Racket、SISCで動作します;文字のリストにファイルを読み取ります(define(file-> char_list path)(call-with-input-file path(lambda(input-port)(let loop((x(read -char input-port)))(cond((eof-object?x) '())(#t(begin(cons x(loop(read-char input-port))))))))))

この関数は適度に高速で、実装間で移植可能です。必要なのは、char_listを文字列に変換することだけです。

最も簡単な方法は次のとおりです。

;引数に制限がある場合は機能しない可能性があります(文字列を適用(file-> char_list'mydata.txt '))

キャッチは、一部の実装では、関数に渡すことができる引数の数に制限があることです。 2049文字のリストはChickenでは機能しません。

別の方法は次のとおりです。

;チキン、ラケットで動作します(foldr(lambda(x y)(string-append(string x)y)) ''(file-> char_list'mydata.txt '))

問題は次のとおりです。まず、フォルダは定義できますが、普遍的に認識されていません(SISC)。第二に、この方法は各文字を追加するために非常に遅いです。

次の2つの関数を作成して、文字のリストをネストされたリストにスライスし、最低レベルがChickenの最大引数数を超えなくなるようにしました。 3番目の関数は、ネストされたcharリストをトラバースし、stringstring-appendを使用して文字列を返します。

(define(cleave_at na)(cond((null?a) '())((zero?n)(list'()a))(#t((lambda(x)(cons(cons(car a)( car x))(cdr x)))(cleave_at(-n 1)(cdr a))))))(define(cleave_binary_nest na)(cond((equal?n(length a))(list a))( #t((lambda(x)(cond((>(length(car x))n)(map(lambda(y)(cleave_binary_nest ny))x))(#tx)))(cleave_at(floor(/(長さa)2))a)))))(define(binary_nest_char-> string a)(cond((null?a) '')((char?(car a))(apply string a))(#t (string-append(binary_nest_char-> string(car a))(binary_nest_char-> string(cdr a))))))

この関数は次のように呼び出されます。

; Racket、Chicken、SISCで動作; foldrメソッドよりも高速(解釈されたChickenが3倍高速)(コンパイルされたChickenが30倍高速)(Racket guiが125倍高速)(binary_nest_char-> string(cleave_binary_nest 2048(file-> char_list'mydata.txt ') ))

アルファベットとスペースに減らすために、さらに2つの機能があります。

(define(alphaspace?x)(cond((and(char-ci> =?x# a)(char-cichar_list'mydata.txt '))(define data_alphaspace(filter alphaspace?data))(define result(binary_nest_char ->文字列(cleave_binary_nest 2048 data_alphaspace)))

これは、Racket、Chicken(解釈およびコンパイル)、およびSISC(Java)で機能します。これらの方言はそれぞれ、Linux、Mac(OS X)、およびWindowsでも機能するはずです。


多分これはあなたが始めるのに役立つでしょう。

(define(file-> list-of-chars file)(with-input-from-file file(lambda()(let reading((chars '()))(let((char(read-char)))( if(eof-object?char)(reverse chars)(reading(cons char chars)))))))))