de[v|b]log

ShellScript, Coffee, iOS/OSX Dev
Origin: Himajinworks.
About.

今日は機能の流れに乗って、気になったので、zsh 5.2.0の機能をちょっと試してみた。 参考は以下のzshのニュースである。

試したこと

(P)展開フラグ

The parameter flag ${(P)...} is now more useful when it appears in a nested expansion.

ということで、パラメータ名としての展開フラグ(P)が便利になったらしい。 まず以下は単純な使用例。

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /usr/bin/env zsh

function test_task()
{
    local variable_name
    local himajin
    himajin="I'm at Himajinworks or コタツ"
    variable_name='himajin'

    echo ${(P)${variable_name}}
}

test_task

こうすることで、

1
I'm at Himajinworks or コタツ

が出力される。これは、${(P)${variable_name}}で、${variable_name}が展開され、更にそれが変数名himajinとして評価されたため、最終的にecho ${himajin}と等価の出力が得られたわけだ。 今回の更新はこれがネストされている、連想配列のような使い方の時に便利ということで、試してみる。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#! /usr/bin/env zsh

function test_task()
{
    local variable_name
    typeset -A associated_array

    variable_name='associated_array'
    associated_array[foo]='bar'

    echo ${${(P)${variable_name}}[foo]}
}

test_task

zsh 5.0.2で試したところ、見事に動かない。 ではここで同じコードを zsh 5.2.0に食わせてみる。するとどうだろう、

1
bar

出力された。Coolだ。割とこれはこの先お世話になる気がする機能だ。

private

The new module zsh/param/private can be loaded to allow the shell to define parameters that are private to a function scope (i.e. are not propagated to nested functions called within this function).

これは見て目がスポーンとなった。privateだ、privateがやってきた。 これまでは関数内にある関数、つまりネスト構造にある子の関数は親の関数の変数のスコープを共有しているわけだ。以下で例を示す。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#! /usr/bin/env zsh

function test_task_parent()
{
    local v
    v='propagete value'

    echo "Parent:  ${v}"
    function test_task_child()
    {
        echo "Child:   ${v}"
    }
    test_task_child
}

test_task_parent
echo "Outside: ${v}"

これは

1
2
3
Parent:  propagete value
Child:   propagete value
Outside:

当然このような振る舞いを示す。ここでprivateを導入してみる。

1
2
3
...
    private v
...

単にlocalprivateに変更しただけである。動作はというと、

1
2
3
Parent:  propagete value
Child:   
Outside:

これはかなり良い。どのくらい良いかというと部屋が寒いことを忘れるくらいには良い。寒いことを忘れるがコメントは”Cool”だ。(部屋は”Cold”だ) これで少し関数を整理するのが楽になる気がする。

まとめ

  • (P)展開オプションが便利になったのを試した。
  • privateが導入されたので簡単に試した。

もう少ししてパッケージマネージャからzsh 5.2.x世代が降ってくるようになったらこの2つを使ってもう少しzshrcの整理をしたい。