prepress-tips
メニュー

更新履歴

取得中です。


codeLayouter の記述メモ


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

最終更新日時: 2010/05/30    

codeLayouter 再検討


  • 新しく取り入れたい発想は ...
    • 日本語プログラム , 日本語シンボル をもっと広く アノテーション として考えて
      • 構造を アノテーション で記述する。
      • 意味を アノテーション で記述する。
      • アノテーション を アノテーション に変換する。
    • いろいろな定義を 位置・名前・内容 を分離して配置する。
    • index は index の世界で閉じ detail は detail の世界で閉じる。
  • そのほかに ...
    • 余分な ; の挿入を抑える。
    • コード中に / があっても変換する。
    • 精密さを求めると java になるので やりすぎに注意する。

 /?- 処理の構造
 
 * ~ wgc問題を解く /
     / ~ プログラムの制御
     ? タイトル //
         / msg( タイトル )
     ? 初期状態 //
     ? 解の配列 //
         /? ** 解の配列 に追加 ( string )
         / ~ GoalSeeker
         / 初期状態 からゴールを探し -> 解の配列
         / msg( 解の配列 )
 
 * ~ プログラムの制御 /
     ? msg //
         /? ** ( Message )を表示する
     ? オプション //
         /? ** デバグ表示オプションの書式
     ? デバグ表示するとき //
 
 * ~ GoalSeeker /
     ? 状態推移 //
         /? * 状態推移 を初期化
         /? ** 状態推移 に追加 ( State ) , ** 状態推移 から最後の状態を削除
     ? 一度あった //
         /? * 一度あった を初期化
         /? ** 一度あった ( State )
         /? ** 一度あった に追加 ( State ), ** 一度あった から削除 ( State )
     / ~ 状態の操作
     ? GoalSeek //
         /? ** start , ** ( State )からゴールを探し -> 解の配列
 
 * GoalSeek // GoalSeek( 状態 , start )
     / if( start ) { 状態推移 を初期化 ; 一度あった を初期化 }
     ? 状態の一意表現 //
         / 状態の一意表現 = 状態の一意の文字列表現
     / if( 一度あった ( 状態の一意表現 ) ) { return }
     / if( ! 制約を満たしているか ) { return }
     / if( ゴールか ) { ゴールですること ; return }
     / 新しい状態になったとき すること
     / 一度あった に追加 ( 状態の一意表現 )
     ? どれか //
     / for どれか ( 連れていけるものは ) { GoalSeek( どれか を連れていったあと ) }
     / 一度あった から削除 ( 状態の一意表現 )
     / 前の状態に戻るとき すること
 
 /?-- 状態の操作
 
 * ~ 状態の操作 /
     /? * 状態
     ? 状態の一意の文字列表現 //
     ? ゴールか //
     ? ゴールですること //
     ? 新しい状態になったとき すること //
     ? 前の状態に戻るとき すること //
     / ~ wgc問題の操作
     ? 制約を満たしているか //
     ? 連れていけるものは //
     ? ( One )を連れていったあと //
 
 * ~ wgc問題の操作 /
     /? * One
     /? * fがいる , * wgの数 , * gcの数
     /? * どれか1つ , * 反対側のどれか1つ
     /? * fとOneを除く , * fとOneを加える
 
 /?- 実ファイルの構造
 
 /name wgc by perl / wgc_pl.pl
     / ~ wgc問題を解く
 
 /name 未指定 /
 
 /use / wgc_pl_detail.txt

 /?- wgc問題を解く
 
 * タイトル // my $Title
     $Title = '狼・山羊・キャベツの川渡し問題 を解く' ;
 * 初期状態 // my $InitialState
     $InitialState = 'fwgc' ;
 * 解の配列 // my @AnswerArray
     @AnswerArray = () ;
 
 ** 解の配列 に追加 \(( string )\) /
 **~    push @AnswerArray , $1
 
 /?- プログラムの制御
 
 * msg // msg( MessageArray )
     print map { "$_\x0a" } @_ ;
 
 ** ( Message )を表示する /
 **~    msg( $1 )
 
 * オプション // Option()
     @ARGV ? $ARGV[0] : '' ;
 
 ** デバグ表示オプションの書式 /
 **~    m,d,i
 
 * デバグ表示するとき // WhenDebug()
     / オプション =~ デバグ表示オプションの書式
 
 /?- goalseeker
 
 * 状態推移 // @StateTrans
     / 状態推移 を初期化
 * 状態推移 を初期化 /
     @StateTrans = () ;
 
 ** 状態推移 に追加 \(( State )\) /
 **~    push @StateTrans , $1
 ** 状態推移 から最後の状態を削除 /
 **~    pop @StateTrans
 
 * 一度あった // %Twice
     / 一度あった を初期化
 * 一度あった を初期化 /
     $Twice = () ;
 
 ** 一度あった \(( State )\) /
 **~    $twice{ $1 }
 ** 一度あった に追加 \(( State )\) /
 **~    $twice{ $1 } = 1 ;
 ** 一度あった から削除 \(( State )\) /
 **~    delete $twice{ $1 } ;
 
 * start / $_[1]
 
 * 状態の一意表現 // my $StateString
 * どれか // my $one
 
 ** ( State )からゴールを探し -> 解の配列 /
 **~    GoalSeek( $1 , 'Start' )
 
 /?- 状態の操作
 
 * 状態 / $_[0]
 
 * 状態の一意の文字列表現 // StateString( 状態 )
     / join '', sort split '', 状態
 
 * ゴールか // IsGoal( 状態 )
     / 状態 eq ''
 
 * ゴールですること // ThingsToDoAtGoal( 状態 )
     ? _状態推移の文字列 / my $StateTransString
         / _状態推移の文字列 = join ' → ', 状態推移 , 状態の一意の文字列表現
     / if( デバグ表示するとき ) { msg( _状態推移の文字列 ) }
     / 解の配列 に追加 ( _状態推移の文字列 )
 
 * 新しい状態になったとき すること // ThingsToDoAtNewState( 状態 )
     ? _状態の一意表現 / my $StateString
         / _状態の一意表現 = 状態の一意の文字列表現
     / if( デバグ表示するとき ) { msg( _状態の一意表現 ) }
     / 状態推移 に追加 ( _状態の一意表現 )
 
 * 前の状態に戻るとき すること // ThingsToDoAtBack( 状態 )
     / 状態推移 から最後の状態を削除
 
 *制約を満たしているか // FillRestrict( 状態 )
     / if( fがいる ) { wgの数 > 0 && gcの数 > 0 }
     / else { wgの数 < 2 && gcの数 < 2 }
 
 *連れていけるものは // PossibleToTake( 状態 )
     / if( fがいる ) { どれか1つ } else { 反対側のどれか1つ }
 
 *( One )を連れていったあと // TakeOne( 状態 , One )
     / if( デバグ表示するとき ) { msg( "- ". One ) }
     / if( fがいる ) { fとOneを除く } else { fとOneを加える }
 
 /?- wgc問題の操作
 
 * One / $_[1]
 
 * fがいる /
     / do { 状態 =~ m,f, }
 * wgの数 /
     / scalar @{[ 状態 =~ m,[wg],g ]}
 * gcの数 /
     / scalar @{[ 状態 =~ m,[gc],g ]}
 * どれか1つ /
     / ( sort split '', 状態 )
 * 反対側のどれか1つ /
     / ( sort "fwgc" =~ m,[^ 状態 ],g )
 * fとOneを除く /
     / ( join '', 状態 =~ m,[^f One ],g )
 * fとOneを加える /
     / ( 状態 . "f" . ( One ne "f" ? One : "" ) )
 

  • index は “index”らしくなり detail の記述は 既存のコードに近くなった。
    呼び出し方のアノテーション も入りそう。
  • detail は 既存コードから自動作成でき index は detail から自動作成できそう。
    index の修正を detail 側に 自動的にマージ できないか。
  • アノテーション→アノテーション変換 はもっと検討が必要。

codeLayouter 利用時のひな形

作成中。

/name 処理名 html / 処理名.html
    /? 冒頭の記述
    ・・・

/name 処理名 js / 処理名.js
    /? 冒頭の記述
    ・・・

/?- 処理

    * 処理の記述 /
        / 処理の詳細の記述
        ・・・

/?- 実ファイルの構造

/name 処理名 html /

    / HTMLの記述
    * HTMLの記述 /
        / HTML header
        / タグの記述
        / HTML footer

    * タグの記述 /
        ・・・

/name 処理名 js /

    / 変数宣言の記述
    / 処理の記述

    * 変数宣言の記述 /
        / 処理の変数宣言
        ・・・

    * 処理の記述 /
        / 処理の記述
        ・・・

/use / 処理名_detail.txt

/?- 処理 詳細

    * 変数の記述 / 変数のシンボル
    ・・・

    * 処理の変数宣言 /
        / 変数の宣言と初期化
        ・・・
        ? 関数呼び出しの記述 // 関数のシンボル
        ・・・

    *処理の詳細の記述 /
        ・・・

    * 関数呼び出しの記述 /
        ・・・

  • 終了タグの記述
    • <tag -> や <-tag> に置き換える。
  • 余分な ; の発生を抑える
    • 1行 と 複数行 のコードの記述を使い分ける。
    • コードの記述の終わりに /? を入れる。

my $pl = ( 0 < @ARGV && $ARGV[0] =~ /^[p]$/i );
my $css = ( 0 < @ARGV && $ARGV[0] =~ /^[c]$/i );
my $js = ( 0 < @ARGV && $ARGV[0] =~ /^[j]$/i );
my $tag = ( 0 < @ARGV && $ARGV[0] =~ /^[t]$/i );
my $r = ( 0 < @ARGV && $ARGV[0] =~ /^[r]$/i );
my $dot = ( 0 < @ARGV && $ARGV[0] =~ /^[d]$/i );
my $uws = ( 0 < @ARGV && $ARGV[0] =~ /^[u]$/i );
while( <STDIN> ) {
    $pl && do {
        s,^(\s*)//,$1#,;
        s,^/\*,$1=pod,;
        s,^\*/,$1=cut,;
        s,^(\s*\{\s*)//,$1#,;
        s,^(?!\s*(?:my|our)\s)(\s*)(\S+\s*)\([^\)]*\)(\s*\{\s*)//,$1sub $2$3#,;
        s,^(?!\s*sub\s)(\s*[^\{;]*[^\{;\s])\s*;?\s*(\{\s*)//,$1 ; $2#,;
        s,^(?!\s*sub\s)(\s*[^\{;/]*;\s*)//,$1#,;
    };
    $css && do {
        m,^[^{;]*;?\s*{\s*//, && ( s"^([^{;]*);?(\s*{\s*)//"$1$2/*", s"(?=$)" */" );
        m,^\s*//, && ( s"^(\s*)//"$1/*", s"(?=$)" */" );
    };
    $js && do {
        s,^(\s*)(\S+\s*\([^\)]*\)\s*\{\s*)//,$1function $2//,;
        s,^(?!\s*function\s)(\s*[^\{;]*[^\{;\s])\s*;?\s*(\{\s*)//,$1 ; $2//,;
        s,([\,\*])\;(?=\s*$),$1,;
    };
    $tag && do {
        m,^\s*//, && ( s/^\s*/$&<!-- /, s/$/ -->/ ), s,(>\s*);$,$1, ;
        s,<\-([\w\-]+)>,</$1>,g ;
    };
    $r && do {
        s,^(\s*\S+\s*)(\([^\)]*\)\s*\{\s*)//,$1 <- function $2#,;
        s,^(\s*\S+)(\s*)(;?\s*)//,$1 <- NULL$2; $3#,;
        s,^(\s*)//,$1#,;
    };
    $dot && do {
        m,^[^{;]*;?\s*{\s*//, && ( s"^([^{;]*);?(\s*{\s*)//"$1$2/*", s"(?=$)" */" );
        m,^\s*//, && ( s"^(\s*)//"$1/*", s"(?=$)" */" );
    };
    $uws && do {
        m,^[^{;]*;?\s*{\s*//, && s"^([^{;]*);?(\s*){\s*//"$1$2//" ;
        m,^\s*}\s*$, && s"^(\s*)}(\s*)$"$1//$2" ;
        m,^\s*ifb\s.*\S +endif;?(?=\s|$), && s"^(\s*)ifb(\s.*\S) +endif;?(?=\s|$)"$1if$2" ;
        m,^\s*if\s.*?;(?=\s*$), && s"^(\s*if\s.*?);(?=\s*$)"$1" ;
    };
    print;
}

cmd = WScript.Arguments.Item( 0 );
cmd = '"' + cmd.replace( /,/g, '" "' ) + '"';
WScript.CreateObject( "WScript.Shell" ).exec( cmd );
  //WScript.Echo( cmd );

@echo off
cd /d "%~dp0"

set codeLayouter=c:\mytools\codeLayouter.exe
set browser=C:\Program Files\Fenrir ^& Co\Grani\bin\Grani.exe

set fn=%~n0
set fn=%fn:codeLayout_=%

echo new %fn%
echo/ && "%codeLayouter%" %fn%_index.txt || ( pause && exit )

set ex=js

echo/ && echo adjust %fn%.%ex%
( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl adjust_source.pl j < _.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%

( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl -n ^
  -e "BEGIN { use Encode qw( encode decode ) ; }" ^
  -e "print ;" ^
  _.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%

set ex=html

echo/ && echo adjust %fn%.%ex%
( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl adjust_source.pl t < _.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%

( if exist _.%ex% del _.%ex% ) && ren %fn%.%ex% _.%ex%
perl -n ^
  -e "BEGIN { use Encode qw( encode decode ) ; }" ^
  -e "print ;" ^
  _.%ex% > %fn%.%ex%
if exist _.%ex% del _.%ex%

echo/ && echo start browsing %fn%.%ex%
rem cscript //nologo //b start.js "%browser%,%~dp0%fn%.%ex%"

echo/ && pause