Recursive Approach
See also the giggles at the bottom for a generic implementation. :)
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\quark_new:N \StopItems
\cs_new:Nn \milap_new_items: { \begin{itemize} \milap_next_item:n }
\cs_new:Nn \milap_next_item:n {
\tl_if_eq:nnTF {#1} {\StopItems}
{ \end{itemize} }
{ \item #1 \milap_next_item:n }
}
\NewDocumentCommand \NewItems { } {
\milap_new_items:
}
\ExplSyntaxOff
\begin{document}
\NewItems
{hello}
{there}
{world}
\StopItems
\end{document}
Idiomatic expl3 (in my opinion)
Using xparse to grab all the arguments and expl3 to work with them:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \NewItems { u{\StopItems} } {
\tl_set:Nn \l_tmpa_tl {#1}
\begin{itemize}
\tl_map_inline:Nn \l_tmpa_tl { \item ##1 }
\end{itemize}
}
\ExplSyntaxOff
\begin{document}
\NewItems
{hello}
{world}
\StopItems
\end{document}
Comma-Separated List
For completion :)
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \NewItems { m } {
\clist_set:Nn \l_tmpa_clist {#1}
\begin{itemize}
\clist_map_inline:Nn \l_tmpa_clist { \item ##1 }
\end{itemize}
}
\ExplSyntaxOff
\begin{document}
\NewItems{hello,world}
\end{document}
Giggles
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\quark_new:N \StopItems
\cs_new:Nn \milap_new_items:nn { \begin{#1} \milap_next_item:nnn {#1} {#2} }
\cs_new:Nn \milap_next_item:nnn {
\tl_if_eq:NNTF {#3} {\StopItems}
{ \end{#1} }
{ \item #3 \milap_next_item:nnn {#1} {#2} }
}
\NewDocumentCommand \NewItems { O{itemize} O{\item} } {
\milap_new_items:nn {#1} {#2}
}
\ExplSyntaxOff
\begin{document}
\NewItems[enumerate]
{hello}
{there}
{world}
\StopItems
\end{document}