使用可以 return 成功或失败的函数以及列表的 zsh 习语是什么

What is the zsh idiom for using functions that can return success or failure as well as a list

我正在寻找“最佳方式”或公认的 zsh 习惯用法来创建和使用可以 return 成功或失败以及列表或其他文本值的函数。

目前我正在这样做:

function happy
{
    local happy_list=( a b c d )

    if true ; then
        echo $happy_list
        return 0
    else
        return 1
    fi
}

function sad
{
    local sad_list=( a b c d )

    if false ; then
        echo $sad_list
        return 0
    else
        return 1
    fi
}

echo happy
if happy_result=( $( happy ) ) ; then
    echo '$?:' $?
    echo '$#happy_result' $#happy_result
    echo '$happy_result' $happy_result
    echo '$happy_list:' $happy_list
else
    echo '!?!?!?!?'
fi

echo
echo sad
if sad_result=( $( sad ) ) ; then
    echo '!?!?!?!?'
else
    echo '$?:' $?
    echo '$#sad_result' $#sad_result
    echo '$sad_result:' $sad_result
    echo '$sad_list:' $sad_list
fi

这导致

happy
$?: 0
$#happy_result 4
$happy_result a b c d
$happy_list:

sad
$?: 1
$#sad_result 0
$sad_result:
$sad_list:

有没有更干净的方法?特别是 foo=( $( func ) ) 语法似乎可以改进,因为列表已经在函数中创建。

版主更新:我相信现在这是 this question and my preferred answer (if anyone cares) is this answer 的副本。 Meta 中的建议是关闭并合并。我不知道如何进行合并。版主可以帮帮我吗?

zsh 中的惯用法是 return 标量结果在 $REPLY 变量中,数组结果在 $reply 数组中:

all-files-in() {
  reply=( $^@/*(ND) )
  (( $#reply ))
}

if all-files-in /foo /bar; then
  print -r there were files: $reply
else
  print -ru2 there were none
fi

另一种方法是调用者指定存储结果的变量名,并使用evalP参数扩展标志进行间接赋值。

all-files-in() {
  eval ='( $^@[2,-1]/*(ND) )
  (( $#'' ))'
}

if all-files-in files /foo /bar; then
  print -r there were files: $files
else
  print -ru2 there were none
fi