Mis see on
PyMini on Swiftis kirjutatud Pythoni alamhulga interpretaator, mis on klaviatuuri sisse ehitatud. Sellel jooksevad kõik sinu paneelid ja kõik sinu toimingud. See loeb sedasama Pythonit, mida sa juba tunned, ja üks keel kannab mõlemat: skripti, mis joonistab liidese, ja skripti, mis kirjutab sõna ümber.
# an action: text in, text out
def transform(text):
return text.upper()
# a panel: a view, and what a tap does
def view(state):
return button("Shout", "shout")
def on_action(action, state):
insert(context()["word"].upper())
return stateMiks seda kasutada
Tegime PyMini, sest Clink vajas viisi, kuidas inimesed saaksid oma klaviatuuri skriptidega täiendada, ja miski, mida leidsime, ei mahtunud klaviatuuri sisse. Klaviatuuridega pole see aga kuidagi seotud, nii et nüüd on see avatud lähtekoodiga eraldi Swifti pakett igale rakendusele, mis tahab lasta oma kasutajatel veidi Pythonit kirjutada.
See ei ole CPython ega sisalda seda. Klaviatuurilaiendus saab murdosa sellest mälust, mille saab rakendus, ja CPythoni binaar ning kuhi kulutaksid selle eelarve ära enne, kui su skript jooksma hakkaks. PyMini on paarsada kilobaiti Swifti, ilma ühegi binaarsõltuvuseta.
See sobib kõikjale, kus kasutajad tahavad oma loogikat: tekstiteisendused kirjutamisrakenduses, reeglid ülesannete- või eelarverakenduses, valemid, automatiseerimised, mängumodid või pistikprogrammide süsteem kogukonnaga rakendusele. Paljud oskavad juba natuke Pythonit, seega pole vaja uut keelt õpetada, ja skript on lihttekst, mida saad salvestada, sünkroonida ja jagada nagu iga teist seadet.
import PyMini
let py = PyRuntime(modules: ["math", "json", "re"])
// your app, as a Python function
py.define("shout") { call in
try call.argument(0, as: String.self).uppercased()
}
// a script one of your users wrote
try py.load("""
def tidy(text):
return shout(" ".join(text.split()))
""")
try py.call("tidy", " hello there ") // HELLO THERE| Kutse | Mida see teeb |
|---|---|
import PyMini | Ilma sõltuvusteta ja ilma midagi käsitsi kaasa pakkimata. Lisa Swifti pakett ja see töötab iOS 15, macOS 12, tvOS 15, watchOS 8 ja visionOS 1 või uuemal. |
py.define("shout") { call in ... } | Sinu rakenduse võimalused muutuvad Pythoni funktsioonideks ja mooduliteks. Argumendid saabuvad Swifti tüüpidena ja see, mida tagastad, jõuab skriptini Pythoni väärtusena. |
PyLimits(steps: 200_000) | Iga kutse jookseb sammueelarvega ja selle lõppemine on viga, mida ükski skript kinni püüda ei saa. Hooletu while True lõpeb teatega, mitte külmunud rakendusega. |
PyRuntime(modules: ["math"]) | Skriptid ei saa faile, võrku ega protsesse. Nad ulatuvad ainult funktsioonideni, mille sa defineerid, ja standardmooduliteni, mille sisse jätad. |
py.call(hook: "on_open") | Kutsu skript välja, kui sinu rakenduses midagi juhtub. Konks, mida skript pole defineerinud, jäetakse vahele, nii et iga konks võib olla valikuline. |
catch let error as PyError | Vead tulevad tagasi Pythoni erindi nime ja reanumbriga, valmis näitamiseks inimesele, kes skripti kirjutas. |
import sys | sys.version ütleb interpretaatori nime ja versiooni ning käsk pymini trükib sama rea. Nii saab skript teatada, milline versioon on teda ümbritsevas rakenduses. |
Lähtekood, keele kirjeldus ja testid on GitHubis.
Mida see lubab
Skriptil pole ligipääsu failisüsteemile, võrgule ega ühelegi protsessile: liivakast on interpretaatori kuju, mitte nimekiri asjadest, mida ta keelab. import on ainus uks välja ja see avaneb lühikesele nimekirjale nimeruumidest, mis üksnes arvutavad. Kõik muu maksab samme. Iga avaldis, iga tsükli ring, iga regulaaravaldise samm ja iga JSONi rida kulutab ühe 2 000 000-st, ning sõned ja loendid on kasvades piiratud.
Jagatud paneelis imporditav
jsonmathrandomresystime
Eelarvet ei saa kinni püüda. except-klausel püüab KeyErrori, aga mitte katkestust, mis lõpetab lõputu tsükli: just selle püüdmine oleks viis, kuidas kontrolli alt väljunud skript edasi jookseks.
Muudatuste logi
PyMini iga versioon, uusim eespool, ja mis sellega lisandus.
PyMini 2.0
Esimene versioon oskas sõna suurtähtedeks teha ja nuppudest ruudustiku laduda. Teine on keel, milles saab kirjutada väikese programmi, ja paneel, mis vastab puudutusele, mitte ei kanna kaasas üht kindlat.
| Näide | Mis muutus |
|---|---|
[word for word in words if word] | Hõlmavad avaldised, lambdad, ennikud, hulgad ning try / except / finally / raise. |
f"{total:,.2f}" | f-stringi teisendused ja täielikud vormingukirjeldused, ühised str.formatiga ja format()-iga. |
f"""Hello {name}""" | Kolmekordsete jutumärkidega sõned, toorsõned ja mitmerealised f-stringid. |
import math, random, time, json, re | Viis nimeruumi ja mitte ühtegi muud, kõik puhtad. |
re.sub(r"\s+", " ", text) | Regulaaravaldised Clinki enda mootoril, mis kulutab sama sammueelarvet. |
on_action(action, value, state) | Paneelid käsitlevad ise oma puudutusi, hoiavad päris olekut ja neil on üksteist juhtelementi rohkem. |
replace(len(word), word.upper()) | Skriptid saavad paluda klaviatuuril midagi teha ja lugeda, mis on kursori ümber. |
Current sentence | Toimingud loevad välja mis tahes osa, mitte üksnes sõna ja seda, mis sellele eelneb. |
import re
def initial():
return {"words": []}
def view(state):
top = sorted(set(state["words"]), key=lambda w: -len(w))[:3]
return vstack([text(f"{len(state['words']):,} words", mono=True)]
+ [row(w, detail=f"{len(w)}") for w in top])
def on_open(state):
state["words"] = re.findall(r"\w+", context()["before"])
return statePyMini 1.0
Esimene versioon. Toiming muutis ühe sõne teiseks ja paneel koosnes mõnest juhtelemendist, mille nupud kirjutasid kindla teksti või seadsid väärtuse.
| Näide | Mis muutus |
|---|---|
def transform(text): | int, float, str, bool, None, list ja dict ning if, while, for ja def vaikeväärtuste ja nimeliste argumentidega. |
f"{n} words" | f-stringid ilma vormingukirjelduseta ning indekseerimine ja lõikamine negatiivsete indeksitega. |
sorted(text.split()) | 24 sisseehitatud funktsiooni ning str-i, list-i ja dict-i tavalised meetodid. |
button("+", set={"count": 1}) | Tekst, nupud, väljad, virnad ja ruudustik. Nupp sai kirjutada teksti või muuta olekut, muud mitte. |
while True: | Mitte ühtegi importi, iga skripti jaoks sammude eelarve ning piirid sellele, kui suureks sõned ja loendid kasvada tohivad. |
Kuhu edasi
Kogu keelepind, paneelide sõnavara ja ehitaja, mis kirjutab mõlemad ilma et sa ühtegi rida trükiksid.
Tegevused ›Paneelid ›Pistikprogrammid ›Looja ›