2011-02-27 9 views
2

の多くは、スタックオーバーフローで使用されているASCII数字であり、codegolf.SEは同じ方法で整形しています。"File IO in Dummies"がありますか?

これはすべてうまくいきましたが、出力に多少の変化を加えたいと思い、最近の質問Output a playable crossword gridを明示的に書いて、グラフィック形式の入力を促しました。

喜んで私は、ポストスクリプトで参照実装をハックしようとしました。悲しいかな、私はその言語には全く慣れていないので、基本的なファイルIOを実行するのに問題があります。誰もがトピックをカバーする基本的なリソースを知っていますか?

私は

  • file
  • (%stdin)
  • token
  • readstring
  • readline

の承知していますが、私はかなりUNCLています最後の3つのリターンと、それを手に入れた後の操作方法を耳にします。

私はは、いくつかの<value> <boolean>ペアを返すことを考え出した、と私はブール値をテストするためにifを使用することができてい。じゃあ何?

答えて

10

ポストスクリプトに関する良い本は、Gleen Reidの "post in script in postscript"です。あなたは自分のウェブサイトから個人的に自由に本を得ることができましたが、それはダウンしています。あなたはまだそれをダウンロードすることができます http://replay.waybackmachine.org/20090621100720/http://www.rightbrain.com/pages/books.html

第14章はファイルioとサンプルコードをカバーしています。

+0

私はwaybackmachineのリンクを見つけるために時間を取ることができるなら私はそれを+2にするだろう。ありがとう。 – dmckee

+0

ええと、私はこのポストスクリプトで2日間しか行っていませんでしたが、私は誰か "ポストスクリプトで考える"という人は...狂っていなければならないと思っていますか?しかし、素晴らしい参照。 –

5

単純なテキストファイル(クロスワードパズルレイアウトを表す)を、そのクロスワードパズルをページに描画するポストスクリプトコードに変換したいと思うようです。 PostScriptがTuring-completeであることは事実ですが、これを行うようにプログラムすることができますが、PostScriptですべてをプログラミングするのは良いアプローチではないと思います。

PostScriptは、特に任意のデータを使いたい場合には、プログラミングが難しい言語です。私がPostScript出力をしたいときは、すべてのパラメータがハードコードされた状態で、私が望むものを描画するサンプルPostScriptをハッキングすることから始めます。次に、PostScriptコードを出力する他の言語でコードを書いて、入力に基づいて必要に応じて適切な部分を変更します。

私はそれが非常によく読まないので、ここに例があります。円の半径を含む入力ファイルがある場合、その半径を読み取るプログラムをPythonで作成し、その円を描画するためにPostScriptコードを書き込んで、その半径をPostScriptにハードコードします。

私は数年前にクロスワードパズルプロジェクトに取り組み始めました。あまりにも遠くまで進まなかったのですが、添付されたPostScriptコードは小さなクロスワードパズルを描きます。 「適切な」PostScriptは、私が気にかけなかったいくつかの文書慣習に従っていることに注意してください。私はそれらについて私が掲示することができるいくつかの概要ノートを持っています。

このPostScriptコードはいくつかの計算を行います。一般的に私は、PostScriptインタプリタだけが持つデータを必要とするもの、例えば、現在のフォントの文字列の幅を中心にするために、PostScriptに関数を書くつもりです。

私はこれを掃除していません。お気軽に説明してください。 HTH。

%! 

% "Example" 
% by (author) 
% Generated 16 Apr 2005 22:19 by (program name) 

% should really be eps 

% unit conversions 

/inch {72 mul} bind def 
/cm {inch 2.54 div} bind def 



%%%%%% start of adjustable parameters 

% these may be fiddled with, within reason 
% be careful not to change the syntax 

% paper size 
/page_width 8.5 inch def 
/page_height 11 inch def 

% page margins 
/top_margin 1 inch def 
/left_margin 1 inch def 

% how many "cells" wide and high 
/puzzle_width 9 def 
/puzzle_height 9 def 

% cell_size: height and width of a one-letter square, in points 
/cell_size .25 inch def 

% line width, in points. 1 is about maximum. 
/line_width .375 def 

% font and size for the numbers 
/cell_font {/Helvetica 5} bind def 

% top/left margin for numbers within a cell 
/num_margin 1.5 def 

%%%%%% end of adjustable parameters 



<< /PageSize [page_width page_height] >> setpagedevice 


/w_pts puzzle_width cell_size mul def 
/h_pts puzzle_height cell_size mul def 

/ulx left_margin def 
/uly page_height top_margin sub def 
/lrx ulx w_pts add def 
/lry uly h_pts sub def 


% draw grid 

line_width setlinewidth 
0 setgray 

newpath ulx uly w_pts h_pts neg rectstroke 

lry cell_size uly { 
    newpath ulx exch moveto w_pts 0 rlineto stroke 
} for 

ulx cell_size lrx { 
    newpath lry moveto 0 h_pts rlineto stroke 
} for 


% fill in black spaces 

% ulx uly width height blackrect 
% all in terms of cells; upper-left-most is 0,0 
/blackrect 
{ 
    << >> begin 
    /h exch def /w exch def /y exch def /x exch def 
    newpath 
    ulx x cell_size mul add 
    uly y cell_size mul sub 
    w cell_size mul 
    h cell_size mul neg 
    rectfill 
    end 
} bind def 

0 setgray 
0 0 1 1 blackrect 
3 0 2 1 blackrect 
8 0 1 1 blackrect 
4 1 1 1 blackrect 
2 2 1 1 blackrect 
6 2 1 1 blackrect 
8 3 1 1 blackrect 
0 4 2 1 blackrect 
7 4 2 1 blackrect 
0 5 1 1 blackrect 
2 6 1 1 blackrect 
6 6 1 1 blackrect 
4 7 1 1 blackrect 
0 8 1 1 blackrect 
4 8 2 1 blackrect 
8 8 1 1 blackrect 


% draw numbers 

% x y h s drawnum 
% x and y in terms of cells; upper-left-most is 0,0. s is string. 
% h is height of numbers. should never change, so compute once before any calls. 
/drawnum 
{ 
    << >> begin 
    /s exch def /h exch def /y exch def /x exch def 
    newpath 
    ulx x cell_size mul add num_margin add 
    uly y cell_size mul sub num_margin sub h sub 
    moveto s show 
    end 
} bind def 

0 setgray 
cell_font selectfont 

% compute font height 
mark 
newpath 0 0 moveto 
(0) false charpath flattenpath pathbbox 
/fh exch def 
cleartomark newpath 

1 0 fh (1) drawnum 
2 0 fh (2) drawnum 
5 0 fh (3) drawnum 
6 0 fh (4) drawnum 
7 0 fh (5) drawnum 
0 1 fh (6) drawnum 
3 1 fh (7) drawnum 
5 1 fh (8) drawnum 
8 1 fh (9) drawnum 
0 2 fh (10) drawnum 
3 2 fh (11) drawnum 
4 2 fh (12) drawnum 
7 2 fh (13) drawnum 
0 3 fh (14) drawnum 
2 3 fh (15) drawnum 
6 3 fh (16) drawnum 
2 4 fh (17) drawnum 
1 5 fh (18) drawnum 
7 5 fh (19) drawnum 
8 5 fh (20) drawnum 
0 6 fh (21) drawnum 
3 6 fh (22) drawnum 
7 6 fh (23) drawnum 
0 7 fh (24) drawnum 
2 7 fh (25) drawnum 
5 7 fh (26) drawnum 
6 7 fh (27) drawnum 
1 8 fh (28) drawnum 
6 8 fh (29) drawnum 


showpage 
+0

ポストスクリプトを生成するためのcの書き方は別のアプローチでしたが、ポストスクリプトで単純に行うのはかわいいと思っていました。私はそれを取るのは難しいです。私は参考マニュアルと青と緑の本を手にしたので、私の脳に実装されていない罠を投げつけているIO以外のものであればOKです。 * ::一口:: * – dmckee

+0

まあ、それは私のために難しいです。実際のPSハッカーが簡単に見つけられるかもしれません。私はリファレンスマニュアルしか持っていません。 私はPythonを自分で使います。私はあなたがそれを使用したことを見ていますが、それほど多分ではありません。それははるかに生産的です、私のCのスキルは現在錆びています。 – Vamana

6

ポストスクリプトの入門セクションで頻繁に言及されていない、ポストスクリプトのファイルIOのいくつかのトリックとショートカットがあります。その中で最も秘密の秘密は 'トークン'演算子です。 (ネームタイプオブジェクトを生成する)、数字(整数型または実体オブジェクトを返す )、またはこれらの配列を読み込むためにインタプリタのスキャナを借りることができます(ただし、実行可能配列の表記法を使用する場合のみ中括弧、それ以外の場合は、左角括弧を表すマークタイプオブジェクトを取得します)。簡単な例として

は、私は多くの場合、PostScriptプログラムで拡張解説セクションを埋め込むために、このワンライナーを使用します。

%! 
{ currentfile token pop /END-COMMENT eq {exit} if } loop 
Each word here is read from the current file and converted 
into a name object and compared to "/END-COMMENT". 
It can have but does not need a preceeding slash. 

This program produces an image of a snowman in a blizzard, 
suitable for use as stationary. 
END-COMMENT 

showpage 

編集:私は今、これは本当にひどい答えであることを認識 .. 。 これまでのところ。

(Some 
multi-line 
text) 
pop 

だから、本当のためにこの時間:

私の例では、上記よりも少しあります。

まず、loopが必要です。

{ 
} loop 

このループの内側には、いくつかのデータがあります。

/src (datafile) (r) file def 
{ 
    src readline 
} loop 

ご覧のとおり、ファイル読み取り演算子はすべて、スタックの先頭にブール値を返します。完璧!

/src (datafile) (r) file def 
{ 
    src readline { 
    }{ 
     exit 
    } ifelse 
} loop 

だから、何かをしてループし続けますブール真が、(ノーモア・データ)ブール偽のループが終了します。しかし、readlineにはデータを入れる文字列が必要です。そして、それは偽の場合でも文字列を返します。

/src (datafile) (r) file def 
/str 80 string def 
{ 
    src str readline { 
     processline 
    }{ 
     pop exit 
    } ifelse 
} loop 

ファイルからのデータの行(最大80文字)を含む文字列があります。 Postscriptの構文に全く似ている場合は、ループ内でtokenを使用することができます(最初の例のように、ファイルから各単語を読み取り、実行可能名に変換してリテラル名と比較します)ループ)。または、ループ内でget(またはforallループ)を使用して、各バイトを整数として抽出できます。しかし、すばらしいことはsearchです。

この手順では、文字列をスペース区切りの単語でスキャンし、各行をstdoutに1行ずつ出力します。

/processline { % (line) 
    () { % (line) () 
     search { % (post) () (pre) 
      = 
     }{ % (no-match) 
      = 
      exit 
     } ifelse 
    } loop 
} def 

ここでは、最後の単語に同じことを他のものと同じようにしたい場合は、通常、ここで重複するのが簡単です。です。一番上の文字列を処理するには手間がかかります次にをテストしてください。本当に面倒なことではありません。幸いなことにsearchは結果を返す便利な順序です。それはあなたがそれを扱うことができるように、文字列の先頭を上に置きます。それから、それはあなたに "マッチ"(これはあなたが最初に与えた "シーク"と同じですが(現行のストリングに参照されていますが))と残りの部分を与えます。それらはループの次の段階のために既に正しい順序になっています。

外部ファイルから読み込んだスペース区切りの単語はどうしますか?

数字を表す場合は、cviまたはcvrとすることができます。英数字の場合は、printまたはshowです。またはcvnを使用し、それらを原子記号として使用します。

+0

私は不定長の行を保持するために文字列バッファを成長させる[readlineのラッパー関数](http://groups.google.com/group/comp.lang.postscript/browse_thread/thread/6799414eb7490e52#)を投稿しました。 –

+0

私は「一番上の文字列を処理して*次に*ブール値をテストするためのトリッキーなもの」という例を持っています。[ここ](https://groups.google.com/d/msg/comp.lang.postscript/h4CtQ- 7edu0/7plTa2cP0I8J)。 –

関連する問題