Conseils pour jouer au golf à Lisp


9

Quels sont les conseils généraux pour jouer au golf en Lisp (tout dialecte)? Veuillez poster un pourboire par réponse, et uniquement les réponses spécifiques à un dialecte de Lisp (par exemple, "supprimer les commentaires" n'est pas une réponse).

Veuillez poster le dialecte de Lisp auquel votre pourboire s'applique avec votre pourboire.



1
Imaginez-vous que ceux-ci seront distincts des conseils pour jouer au golf dans Scheme and Racket ?
Alex A.

1
Je vous conseille d'utiliser tinylisp, une version plus petite et dépouillée de Lisp pour votre plaisir de golf.
ckjbgames

Réponses:


4

Ordonner les paramètres de fonction pour minimiser les espaces blancs

Au lieu de

(defun f(a b)(...))
...
(f x(1+ y))

essayez quelque chose comme

(defun f(b a)(...))
...
(f(1+ y)x)

1

Imprimer des chaînes composées de lettres majuscules via des atomes d'impression

La princfonction en Common Lisp est courte et imprime des objets sans caractère d'échappement. Si vous imprimez des symboles Common Lisp, qui ont la synaxe 'symbol-name, cela vous évite d'avoir besoin de guillemets autour de ce que vous voulez imprimer, et peut également économiser sur les espaces. Notez que lors de l'impression de symboles, ils seront mis en majuscule. De plus, il n'ajoute pas de nouvelle ligne ni d'espace, vous n'avez donc pas besoin de concaténation.

Par exemple,

(princ'hai)

imprimera HAI.

Et

(princ'hai)(princ(read))

imprimera HAI, demandera une entrée et l'imprimera de nouveau, par exemple si vous tapez bonjour, le résultat est

HAIhellohello


1

Utiliser loopetformat , ce qui est comme printfsur les stéroïdes. formatinclut l'itération et les conditions, ainsi que les chiffres romains, les nombres anglais et les pluriels anglais. C'est très, très moche et très compact.


1

Sortie conditionnelle

GNU Common Lisp

~v^

La directive up-and-out~^ est le plus souvent utilisée dans une opération de formatage de liste pour se terminer après le dernier élément de liste. Cependant, il peut également être utilisé avec un vmodificateur pour consommer un argument, auquel cas il se termine si cet argument est nul. Ceci est particulièrement utile pour traiter le zéro produit par dotimes.

(loop as n from 1 to 10 do(format t"~d~%"n))

(dotimes(n 11)(if(> n 0)(format t"~d~%"n)))

(dotimes(n 11)(format t"~v^~d~%"n n))

format(condition)

Le premier argument de formatpeut être l'un t, nilalias (), ou un flux. S'il est passé t, il sortira vers stdout, s'il nilretournera la sortie formatée sous forme de chaîne. Cela peut être utilisé de manière conditionnelle. L'exemple ci-dessus pourrait être aussi court que:

(dotimes(n 11)(format(> n 0)"~d~%"n))

Si une valeur a été sortie, la valeur de retour sera nil. Pour cette raison, il peut également être utilisé comme condition de fin pour une doboucle:

(do((n 11))((<(decf n)1))(format t"~d~%"n))

(do((n 11))((format(>(decf n)0)"~d~%"n)))

~[...~]

Le formateur conditionnel consomme un argument et sélectionne une chaîne de formatage dans une liste par index. Un cas d'utilisation courant est avec le formateur par défaut ~:;pour sélectionner entre zéro et non zéro.

(dotimes(n 11)(format t"~v^~[~r~:;~d~]~%"n(mod n 3)n))

Les formateurs conditionnels peuvent également être imbriqués, auquel cas chacun consommera un argument à son tour.


~&

Dans chacun des exemples ci-dessus, ~%est utilisé pour émettre une nouvelle ligne. Dans la plupart des cas, cela pourrait être remplacé par une nouvelle ligne littérale. Une autre option consiste à utiliser ~&, qui émettra une nouvelle ligne si et seulement si le curseur de sortie n'est pas au début d'une ligne, alias a fresh-line.

Les deux ~%et ~&peuvent également prendre un argument, avec unv modificateur ou une constante, et produiront autant de nouvelles lignes. Ils accepteront également tous les deux avec plaisir un argument négatif, auquel cas ils n'émettent rien.


Références externes

Common Common Lisp
18. Quelques recettes FORMAT

Common Lisp the Language, 2e édition
22.3.3. Sortie formatée en flux de caractères

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.