ํ์ฌ Perl์ Moose, Mouse, Moo ๋ฐ Mo ๋ฑ์ผ๋ก ํ์ฅ๋ฉ๋๋ค. ์ด ๋ชจ๋์๋ ๋ชจ๋ ํ๋์ ๊ณตํต์ ์ด ์์ต๋๋ค. ์์ฑ ์ ํ์๋ has
๋ฉ๋๋ค. ๋๋ ์ฐ๋ฆฌ๊ฐ ๋ฌด์ค๊ฐ ํ๋ฆฝํ ๊ด์ต์ ๋ฐ๋ฅด๋ ๋ชจ๋ ๊ฒ์ ๊ฐ์ ํ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค.
has $name|@$names => %options
๋ ๋ง์ ๊ฐ์ฒด ๋น๋ ์์คํ
์ค ํ๋์ ๋ํด ์ ์ ํ๊ฒ ํ์ฑ๋ ์์ฑ์
๋๋ค.
์ฐ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ ๋ค๋ฃจ์ด์ผ ํฉ๋๋ค.
has "foo" => ()
has ("foo" => ())
has [qw/foo bar/] => ()
has ([qw/foo bar/] => ())
@dtikhonov , ์ด๊ฒ์ ๋ณผ ์ ์์ต๋๊น?
Moose et al. ๋ชจ๋์ด๊ณ has
๋ Perl ํค์๋๊ฐ ์๋ ํจ์ ํธ์ถ์
๋๋ค. Moose์ ๋ํ ์ง์์ ctags Perl ํ์์ ํฌํจ์ํค๋ฉด ํค์๋์ฒ๋ผ ๋ณด์ด๋ ํจ์ ํธ์ถ์ ๋์
ํ๋ ๋ง์ Perl ๋ชจ๋์ด ์๊ธฐ ๋๋ฌธ์ ๋ฏธ๋๋ฌ์ด ๊ฒฝ์ฌ๋ฉด์ ๋์ด๊ฒ ๋ ๊ฒ์
๋๋ค.
...์ด ์ฃผ์ ์ ๊ด์ฌ์ด ๋ง์ต๋๋ค. ์ง๋ 3๋ ๋์ DSL์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ctag๋ฅผ ๊ฐ์ ํ์ต๋๋ค.
๋ด ๋น์ ์ ๋ํด http://docs.ctags.io/en/latest/running-multi-parsers.html?highlight=subparser#tagging -definitions-of-higher-upper-level-language-sub-base๋ฅผ ์ฐธ์กฐํ์ธ์.
Moose ํ์ ํ์๋ Perl ํ์์์ ์คํํ ์ ์์ต๋๋ค.
package Point;
use Moose; # automatically turns on strict and warnings
has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');
sub clear {
my $self = shift;
$self->x(0);
$self->y(0);
}
package Point3D;
use Moose;
extends 'Point';
has 'z' => (is => 'rw', isa => 'Int');
after 'clear' => sub {
my $self = shift;
$self->z(0);
};
Perl ํ์๊ฐ "use" ํค์๋๋ฅผ ์ฐพ์ผ๋ฉด Perl ํ์๋ ๋ฑ๋ก๋ ํ์ ํ์์ ์ด๋ฅผ ์๋ฆฝ๋๋ค.
Moose ์๋ธํ์๋ ๊ทธ๋ฌํ ์๋ธํ์์
๋๋ค.
Moose ์๋ธํ์๋ ํต์ง๋ ๋ชจ๋ ์ด๋ฆ์ด "Moose"์ธ ๊ฒฝ์ฐ ์์ฒด์ ์ผ๋ก ํ์ฑํ๋ฉ๋๋ค.
Moose ํ์ ํ์๋ Perl ์ธ์ด ๊ฐ์ฒด๋ฅผ ์ฐพ๊ธฐ ์ํด cork๋ผ๋ ctags ๋ด๋ถ ๊ธฐํธ ํ
์ด๋ธ์ ์ค์บํฉ๋๋ค.
Perl ํ์์ ์ํด "ํจํค์ง" ์ข
๋ฅ๋ก ํ์๋ฉ๋๋ค. Moose ํ์ ํ์๋ ๊ธฐํธ ํ
์ด๋ธ์์ "Point"๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
Perl ํ์์ ์ํด ์ด๋ฏธ ํ๊ทธ๊ฐ ์ง์ ๋์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ Moose ํ์๋ "Moose" ์ธ์ด์ "class" ์ข
๋ฅ๋ฅผ ์ฌ์ฉํ์ฌ "Point"์ ๋ํ ์ ํ๊ทธ๋ฅผ ๋ง๋ญ๋๋ค.
Moose ํ์ ํ์๋ "Point"๋ฅผ ๋ฒ์ ์คํ์ผ๋ก ํธ์ํฉ๋๋ค.
Moose ํ์ ํ์๋ "has"๋ฅผ ํค์๋๋ก ์ฐพ์ต๋๋ค. Moose ์๋ธํ์๋ "has"์ ๋ํ ๋ค์ ํ ํฐ์ผ๋ก ๋ฐ๊ฒฌ๋ "x"์ ๋ํ ํ๊ทธ๋ฅผ ๋ง๋ญ๋๋ค. "x", " scope:class :Point language:Moose "์ ๋ํ ํ๊ทธ๋ฅผ "x"์ ๋ถ์
๋๋ค...
C++ ํ์์ ๋ํด์๋ ์ด๋ฏธ ์ด ์์ด๋์ด๋ฅผ ๊ตฌํํ์ต๋๋ค.
QtMoc ์๋ธํ์๋ Qt๋ฅผ ์ฌ์ฉํ์ฌ C++ ์ฝ๋๋ฅผ ํ์ฑํ๊ธฐ ์ํ ๊ฒ์
๋๋ค. QtMoc ์๋ธํ์๋ C++ ์ธ์ด์ ๋ฐฉ์ธ์ผ๋ก ๋์
๋ ์ ํธ์ ์ฌ๋กฏ์ ์ธ์ํฉ๋๋ค.
ํ์ ํ์๋ฅผ ๊ตฌํํ๋ ค๋ฉด ๊ธฐ๋ณธ ํ์์ ์ ์ง ๊ด๋ฆฌ์๋ก๋ถํฐ ํ๊ฐ๋ฅผ ๋ฐ์์ผ ํฉ๋๋ค.
@dtikhonov ๋ ๊ทธ๋ ๊ฒ ๊ธ์ ์ ์ด์ง ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
ํ์ ๋ฉ์ธํ ์ด๋์ ํ์์ ์๋ธํ์๋ฅผ ๋์ ํ๊ณ ์ถ์ ์ ์ฌ์ด์ ๊ฐ๋ฑ์ด ์๊ธด๋ค๋ฉด u-ctags ํ๋ก์ ํธ์์ ํ์ ๋ฉ์ธํ ์ด๋๋ฅผ ๊ฐ๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๊ธฐ ๋๋ฌธ์ ์๋ธํ์ ๊ตฌํ์ ํฌ๊ธฐํ๊ฒ ์ต๋๋ค.
@dtikhonov , Moose๋ฅผ ์๋ธํ์๋ก ๊ตฌํํ๋ ์์ด๋์ด์ ๊ด์ฌ์ด ์๋ค๋ฉด ์๋ ค์ฃผ์ธ์.
Perl ํ์์ ์์ค ์ฝ๋์ ๋ฏธ์น๋ ์ํฅ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ํ๋กํ ํ์
์ ๋ง๋ค ๊ฒ์
๋๋ค.
์ฝ์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ๊ธฐ๋ฅ์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ๋๋ค. ๊ฐ์ ์๋ฏธ์์ ํจํค์ง๋ ๊ฐ์ฒด ์งํฅ ๋ฐฉ์์ผ๋ก ํ๋ก๊ทธ๋๋ฐํ ๋ "ํด๋์ค"์ด๊ณ "์๋ธ"๋ ๋ฉ์๋์ ๋๋ค. ๊ฐ์ฒด ์งํฅ ํ์ ์ฌ์ฉํ ๋ ๋ชจ๋ ๋ช ๋ช ๋ฒ์ด ๋ณ๊ฒฝ๋์ง๋ง ๊ฐ ๊ฒฝ์ฐ์ ๋น OO ์ฉ์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ์๊ฐ ์ฝ๋๋ฅผ ์์ฑํ ํจ๋ฌ๋ค์์ ์ถ๋ก ํ๋ ๋ฐ ๋ณต์ก์ฑ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์ฆ, "์๋ค"๋ ๋ณต์ก์ฑ์ด ๋ถ์กฑํฉ๋๋ค. ๋ง์ฝ ๋น์ ์ด ๊ทธ๊ฒ์ ๋ณธ๋ค๋ฉด ๋น์ ์ ๋ ๊ฐ์ง ๊ฐ๋ฅํ ํด์์ด ์์ต๋๋ค. ๋๋ (b) Moose-esque ์์ฑ ์ ์ธ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๊ทํ์ ์๋ต์์ "Moose et al" ์ธ์ฉ๋ฌธ์ Perl์์ ์ด๋ฌํ ๋ชจ๋ ๋น๋ ํ๋ ์์ํฌ( has
-attribute ์ ์ธ ํฌํจ)๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด ํด๋น ๊ท์น์ด ์ผ๋ง๋ ๊ฐ๋ ฅํ์ง๋ฅผ ๋ณด์ฌ์ค๋๋ค. Moose๋ Perl์์ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ๋ชจ๋ ์ค ํ๋์
๋๋ค(๋ฉํํ์ DBI ๋ฐ LWP๋ณด๋ค ๋ณ์ด ๋ ๋ง์).
๋๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ค ์คํ(false-positive)์ ๊ฐ์ง ์ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ ์๋์ง๋ง, ๋๋ ์ด ๊ท์น์ ๋ฐ๋ฅด์ง ์๊ณ ๋ง์ ์ฌ๋๋ค์ ๋์ธ ์ ์๋ ๋ชจ๋์ ๊ฒ์ํ ์ฌ๋์ ์์ง ๋ชปํฉ๋๋ค. ๊ฒ๋ค๊ฐ, ๋๋ ์ด ctags๊ฐ ๋จ์ง ์ค์ฉ์ ์ด๊ธฐ๋ณด๋ค๋ ์ด๋ก ์ ์ผ๋ก ๊ฑด์ ํ์ง ์ ๋ง ์์ฌ์ค๋ฝ์ต๋๋ค.
@masatake ํ์ ํ์ ์์ด๋์ด๋ ๋ด ๊ตฌํ๋ณด๋ค ๋ ํ๋ฅญํ๊ณ use
์ ๋ํด ํ
์คํธํ๊ณ ์ด๋ฌํ ๋ชจ๋ ์ค ์ผ๋ถ์ ๋ํด ๋ด๋ถ์ ์ผ๋ก ๋ค๋ฅธ ์๋ฏธ๋ฅผ ํธ์ถํ์ฌ ์ ์ฌํ ์์
์ ์ํํฉ๋๋ค.
https://github.com/universal-ctags/ctags/blob/master/parsers/perl.c#L348
๋ฌธ์ ๋ ๋๋ฌด ๋์์ง ์์ Moose-parser๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๋ชจ๋ ๋ชฉ๋ก์ ์ด๊ฑฐํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๋ํ ๊น๋ค๋ก์ด Moose ํ์ ํด๋์ค๋ฅผ ์คํํ๋ ์ฌ๋์ด ์๋ฌด๋ ์๋ค๊ณ ๊ฐ์ ํด์ผ ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ๋ ๊ฒฝ์ฐ ๋ ๋์ ์๋๋ฆฌ์ค๋ Moose ํ์ ๊ตฌ๋ฌธ ๋ถ์๊ธฐ๋ฅผ ์๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ , ์ ๋ ๊ด์ฐฎ์ต๋๋ค. ๊ทธ๋ค์ด ๊ฐ์ง๊ณ ์๋ ๊ฒ๋ณด๋ค ๋ ๋์์ง๋ ์์ ๊ฒ์ ๋๋ค.
Moose์ฉ C ํ์๋ฅผ ์์ฑํ๋ ๋ฐ ๋์์ด ํ์ํ๋ฉด ์ ๋ ๋์๋๋ฆด ์ ์์ต๋๋ค.
Perl๊ณผ Moose๋ฅผ ์ํ ์ด๋ฌํ ์ข ๋ฅ์ ์ ์ ํ์๊ฐ ctags ๋ฐ์์๋ ์ ์ฉํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ํ์ฌ ํ ๊ตฌ๋ฌธ ๋ถ์์ ์์ ํ์ง ์์ผ๋ฉฐ ๋ณด์ฅ๋์ง ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์๋ฅผ ๋ค์ด ๋ค๋ฅธ ํ๋ก์ ํธ์์ Perl์์ ํ ์คํธ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์์ ํ๊ฒ ์คํํ ์ ์์ต๋๋ค.
@masatake , Perl 5๋ ๋๋ฌด ๋๋ฆฌ๊ฒ ์์ง์ด๋ ํ๊ฒ์ด์ด์ ์ ์ง ๊ด๋ฆฌํ ๊ฒ์ด ๋ง์ง ์๊ธฐ ๋๋ฌธ์ perl.c
์ ์ ์ง ๊ด๋ฆฌ์ธ ์ผ๋ก์์ ์ผ์ ์ฌ์ ์ต๋๋ค. ๋๋ ๋น์ ์ด ์ฐธ์กฐํ ํ์ ํ์ ๋ฌธ์๋ฅผ ์ค์บํ์ต๋๋ค. ๋ด๊ฐ ๋งํ ์ ์๋ ๊ฒ์ ์์ฐ! ์์งํ ๋งํด์, ์ ๋ Universal Ctags ๊ฐ๋ฐ์ ๋ฐ์ ํ๊ฒ ๋ฐ๋ฅด์ง ์์๊ณ ๋น์ ์ด ํฐ ์ง์ ์ ์ด๋ฃจ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
@EvanCarroll , ์ฝ๋ ํ ํฌ: ์์ ๋กญ๊ฒ perl.c
์๋ ๊ฒฐํผํ์ง ์์์ต๋๋ค. ์ผ๋ถ๋ ์์ ํ ๋ชป์๊ฒผ๊ณ , ๋์ด์ผ ๋ณด๋ฉด ์ผ๋ถ๋ ๋ค๋ฅด๊ฒ ๊ตฌํ๋์ด์ผ ํ์ต๋๋ค. "์ฌ์ฉ"์ ์ฌ์ฉ์ ๊ดํ์ฌ: ๋ง์ง๋ค, ์ทจํ ์ .
์ฟจํ๋ค, ์ฟจํ๋ค. ๊ทธ๋ผ ์ด๋ฒ ์ฃผ๋ง์ ๋ฌด์์ ํ ์ ์๋์ง ์์๋ณด๊ฒ ์ต๋๋ค. ์๋ธํ์ ํ๋ ์์ํฌ์ ๋ํ ์์ ๋ ํ์ธํ๊ฒ ์ต๋๋ค.
ํ๋กํ ํ์
์ด ์๋ํฉ๋๋ค.
@EvanCarroll , #2070๋ถํฐ ์์ํ ์ ์์ต๋๋ค.
์ ๋ TypeScript ํ์์ ์ง์คํ๊ณ ์์ต๋๋ค. ๊ทธ๋์ ๋น๋ถ๊ฐ #2070 ์์
์ ํ์ง ์๊ฒ ์ต๋๋ค.
์ํ๋๋๋ก ํดํนํ์ญ์์ค.
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% cat input.pl
cat input.pl
# Taken from https://metacpan.org/pod/Moose
package Point;
use Moose; # automatically turns on strict and warnings
has 'x' => (is => 'rw', isa => 'Int');
has 'y' => (is => 'rw', isa => 'Int');
sub clear {
my $self = shift;
$self->x(0);
$self->y(0);
}
package Point3D;
use Moose;
extends 'Point';
has 'z' => (is => 'rw', isa => 'Int');
after 'clear' => sub {
my $self = shift;
$self->z(0);
};
no Moose;
package Line;
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% ./ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
./ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
zsh: no such file or directory: ./ctags
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% ../../ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
../../ctags --fields=+lineK --sort=no -o - --extras=+s ./input.pl
Point ./input.pl /^package Point;$/;" package line:2 language:Perl
Point ./input.pl /^package Point;$/;" class line:2 language:Moose
x ./input.pl /^has 'x' => (is => 'rw', isa => 'Int');$/;" attribute line:5 language:Moose class:Point
y ./input.pl /^has 'y' => (is => 'rw', isa => 'Int');$/;" attribute line:6 language:Moose class:Point
clear ./input.pl /^sub clear {$/;" subroutine line:8 language:Perl
clear ./input.pl /^sub clear {$/;" method line:8 language:Moose class:Point
Point3D ./input.pl /^package Point3D;$/;" package line:14 language:Perl
Point3D ./input.pl /^package Point3D;$/;" class line:14 language:Moose inherits:Point end:26
z ./input.pl /^has 'z' => (is => 'rw', isa => 'Int');$/;" attribute line:19 language:Moose class:Point3D
clear ./input.pl /^after 'clear' => sub {$/;" attribute line:21 language:Moose class:Point3D
Line ./input.pl /^package Line;$/;" package line:27 language:Perl
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% ./ctags --list-subparsers
./ctags --list-subparsers
zsh: no such file or directory: ./ctags
[yamato@slave]~/var/ctags/perl-moose/Units/simple-moose.d% ../../ctags --list-subparsers
../../ctags --list-subparsers
#NAME BASEPARSER DIRECTIONS
AnsiblePlaybook Yaml base <> sub {bidirectional}
Autoconf M4 base <> sub {bidirectional}
Automake Make base <= sub {dedicated}
ITcl Tcl base <> sub {bidirectional}
JAXRS Java base => sub {shared}
LinuxKernel C base => sub {shared}
LinuxOVS C base => sub {shared}
Moose Perl base <> sub {bidirectional}
OpenVSwitch C base => sub {shared}
PythonLoggingConfig Iniconf base <> sub {bidirectional}
PythonMain Python base => sub {shared}
PythonTuned Python base => sub {shared}
QtMoc C++ base <> sub {bidirectional}
RSpec Ruby base => sub {shared}
SystemdUnit Iniconf base <= sub {dedicated}
TclOO Tcl base <> sub {bidirectional}
YumRepo Iniconf base <= sub {dedicated}
selinuxPolicy selinuxPolicyBase base => sub {shared}
servlet Java base => sub {shared}
[yamato@slave]~/var/ctags/perl-moose% ./ctags --list-kinds-full=Moose
#LETTER NAME ENABLED REFONLY NROLES MASTER DESCRIPTION
a attribute yes no 0 NONE attributes
c class yes no 0 NONE classes
m method yes no 0 NONE methods
ํ๋กํ ํ์ ์ด ์๋ํฉ๋๋ค. @EvanCarroll , #2070๋ถํฐ ์์ํ ์ ์์ต๋๋ค.
๊ทธ๊ฒ์ ๋นจ๋๋ค! ๐
@masatake ์ธ์์ ์
๋๋ค. ๋ ํ ์ผ์ด ์์ต๋๊น? findAttribute
๋ฐ ์ธ์ด ์ฝ๋ฐฑ ์ฐธ์กฐ๋ฅผ ๊ตฌํํ์ต๋๊น?
@masatake ์ธ์์ ์ ๋๋ค. ๋ ํ ์ผ์ด ์์ต๋๊น?
๊ทธ๊ฒ์ด ๋ด๊ฐ ์๊ณ ์ถ์ต๋๋ค :-).
๋ด๊ฐ ์ํ๋ ๊ฒ์ ๋์ณค๋ค๋ฉด ์๋ ค์ฃผ์ธ์.
๋๋ ๋ฌด์ค ๋ฌธ์์ ์ผ๋ถ๋ง ์ฝ์์ต๋๋ค.
@masatake ๋ฉ์ง ๊ฑฐ๋, github์ผ๋ก ํจ์น๋ฅผ ๊ฒํ ํ์ต๋๋ค. ์๊ฐ์ด ์๋์๋ฉด ์ด๋ฒ ์ฃผ๋ง์ ํ๋ฒ ๊ฐ๋ด์ผ๊ฒ ์ต๋๋ค. =) ํ์ง๋ง ์๋ง๋ 0.0001์ด ์์ ์๋ฃ๋ ๊ฒ์ ๋๋ค.
ํ์ง๋ง ์๋ง๋ 0.0001์ด ์์ ์๋ฃ๋ ๊ฒ์ ๋๋ค.
์ฌ์ค์ด ์๋๋ค.
ํ์๋ฅผ ๊ฐ์ ํ๋ ค๋ฉด ctags ๋ด๋ถ API์ ๋ํ ์ง์, ๋์ ์ธ์ด์ ๋ํ ์ง์, Moose, ์๊ฐ ๋ฐ ์ด์ ์ 4๊ฐ์ง๊ฐ ํ์ํฉ๋๋ค
๋๋ ๋ฌด์ค์ ๋ํ ์ง์์ด ์์ต๋๋ค. ์ด๊ฒ์ด ๊ฐ์ฅ ์ค์ํฉ๋๋ค.
์๋ฅผ ๋ค์ด ํ์ฌ ํ์๋ with
ํด๋์ค์ ์ฒจ๋ถ๋ ๊ท์น์ ์บก์ฒํ์ง ์์ผ๋ฉฐ "Moose::Rule ์ฌ์ฉ"์ผ๋ก ์ ์๋ฉ๋๋ค. ๋ด๊ฐ ์๋ ๊ฒ์ "๊ท์น"๋ฟ์
๋๋ค. ๊ทธ๋ฌ๋ ctags๊ฐ ์บก์ฒํด์ผ ํ๋ ๋ ๋ง์ ํญ๋ชฉ์ ์๊ณ ์์ ์ ์์ต๋๋ค.
ctags๊ฐ ์ด๋ฌํ ๊ท์น์ ์บก์ฒํ ๊ฒ์ผ๋ก ์์ํ์ง ์์ต๋๊น?
๊ท์น์ด ํด๋์ค์ ์ฒจ๋ถ๋ ๊ฒฝ์ฐ ํด๋์ค์ ํ๊ทธ์๋ "rule:"์ด๋ผ๋ ํ๋๊ฐ ์์ด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋์ ์ธ์ด๋ฅผ ์๋ ์ฌ๋์ ์ด๋ฌํ ์์ฒญ์ ์ด ํ๋ก์ ํธ๋ฅผ ์ฑ์ฅ์ํค๋ ๋ฐ ํ์ํฉ๋๋ค.
๋๋ ๊ทธ๋ค ์ค ์ผ๋ถ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๊ฒ๋ค์ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ฒญ์ด ์๋ ๊ฒฝ์ฐ ๋์ค์ ๊ตฌํํ ์ ์์ต๋๋ค.
ํ์ฌ ๊ตฌํ์ ํ์ฅํ์ฌ Mouse, Moo ๋ฐ Mo๋ฅผ ์ง์ํ ์ ์์ต๋๋ค.
์๋ Perl ํ์๋ฅผ ์์ ํ์ง ์๊ณ ์ํฉ๋๋ค.
์ฃ์กํฉ๋๋ค. ์ด๋ฏธ #2070์์ ์ค์ํ ์๊ฒฌ์ ๋ง์ํด ์ฃผ์ จ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค.