local function strsplit(delimiter, text)    
if delimiter == "" then                                      
        error("delimiter matches empty string!")
    end                                                                
local list, pos, first, last = {}, 1
while true do                                                    
        first, last = text:find(delimiter, pos, true)   
        if first then -- found?                                
            table.insert(list, text:sub(pos, first - 1))
            pos = last + 1                                        
        else                                                           
            table.insert(list, text:sub(pos))              
            break                                                    
        end                                                           
    end                                                       
    return list
end

M.private.strsplit = strsplit

A-    ANALYSE DU CODE

À première vue, on remarque que notre bout de code est constitué de deux partie séparées.

1-  Un bloc délimité par: local function strsplit(delimiter, text) ……… end (en rouge)

local function strsplit(delimiter, text)  
    if delimiter == "" then
        error("delimiter matches empty string!")
    end
    
local list, pos, first, last = {}, 1
   
  while true do
        first, last = text:find(delimiter, pos, true)
        if first then -- found?
            table.insert(list, text:sub(pos, first - 1))
            pos = last + 1
        else
            table.insert(list, text:sub(pos))
            break
        end
    end

    return list
end 

Dans cette 1ère partie on a:

EN ROUGE: Les mots clé du langage (je pense au C++)
EN ORANGE et ( ):  Les paramètres de la fonction strsplit()
EN BLEU:     les variables
EN VERT:      Les noms de fonction
EN NOIR:       Non identifier 
EN VIOLET:    Chaine de caractères

1-  Un second bloc en dehors de la fonction representer par une seule instruction:   M.private.strsplit = strsplit (en vert)

B- INTERPRETATION ET COMPRÉHENSION DU CODE

//    local function strsplit(delimiter, text) ……… end
En général nous avons une fonction appelée strsplit() qui prend en paramètre un caractère de séparation appelé (delimiter) et le texte (text) à découper en caractère comme l’indique le nom de la fonction (strsplit)

//
   if delimiter == "" then
        error("delimiter matches empty string!")
    end

Dans cette partie, on a un premier bloc if …… end qui compare la variable delimiter à un caractère vide "" et renvoie un message d’erreur si l’instruction: delimiter == "" renvoie true

//
local list, pos, first, last = {}, 1  =>  Affectation multiple
ici 4 variables list, pos, first, last sont initialisée où 
list = {} =>  hash vide
pos = 1
first = nil
last = nil
//
while true do
        first, last = text:find(delimiter, pos, true)
        if first then -- found?
            table.insert(list, text:sub(pos, first - 1))
            pos = last + 1
        else
            table.insert(list, text:sub(pos))
            break
        end
    end
ici on a un bloc (if …… end) imbriqué dans un bloc (while …… end) qui est toujours à true, synonyme de boucle infini.
Le but de la boucle ici c’est de:
	-	D’abord exécuter l’instruction: first, last = text:find(delimiter, pos, true) qui recherche s’il existe un delimiter fourni en paramètre en position 1, à la fonction strsplit et l’affecte aux variables first.
	-	S’il trouve un delimiter, il rentre dans le if et exécute ceci:     table.insert(list, text:sub(pos, first - 1))
            pos = last + 1,
increment la variable pos de 1 pour déplacer la position du delimiter dans le texte, ajoute le mot trouvé à la collection list  puis rentre dans une nouvelle itération du while et ainsi de suite.
	-	sinon (else), il exécute: table.insert(list, text:sub(pos))
	-	Et arrête l’exécution de la boucle while avec break
	-	et retourne la variable list avec toute la collection de mots trouvés:  return list