SPython в 3.11

This commit is contained in:
Mikhalkovich Stanislav 2025-08-31 17:21:18 +03:00
parent 1dc78980b2
commit 6d15540895
43 changed files with 527 additions and 5 deletions

View file

@ -15,7 +15,7 @@ internal static class RevisionClass
public const string Major = "3";
public const string Minor = "11";
public const string Build = "0";
public const string Revision = "3654";
public const string Revision = "3661";
public const string MainVersion = Major + "." + Minor;
public const string FullVersion = Major + "." + Minor + "." + Build + "." + Revision;

View file

@ -1,4 +1,4 @@
%COREVERSION%=0
%REVISION%=3654
%MINOR%=11
%REVISION%=3661
%COREVERSION%=0
%MAJOR%=3

View file

@ -0,0 +1,10 @@
from GraphWPF import *
color = RandomColor()
def MouseMove(x: float, y: float, mb: int):
if mb == 1:
FillCircle(x, y, 10, color)
OnMouseMove = MouseMove

View file

@ -0,0 +1,15 @@
# индекс минимального элемента
def argmin(arr: list[int]) -> int:
if len(arr) == 0:
return -1
res = 0
for i in range(1, len(arr)):
if arr[i] < arr[res]:
res = i
return res
print(argmin([1, 2, 3]))
print(argmin([3, 2, 1]))
# a = [4,9,16,8,2,15,13,13,15,2,8,16,9,4]
a = [i ** 2 % 17 for i in range(2, 16)]
print(argmin([i ** 2 % 17 for i in range(2, 16)]))

View file

@ -0,0 +1,27 @@
N = 7
# Выводит первые N чисел,
# которые можно тремя различными
# способами представить как
# сумму двух квадратов целых чисел
def print_sequence(N: int):
a = 0
while True:
a += 1
for b in range(1, a):
for c in range(1, b):
for d in range(1, c + 1):
for e in range(1, d):
for f in range(1, e):
if a ** 2 + f ** 2 == b ** 2 + e ** 2 == c ** 2 + d ** 2:
print(a ** 2 + f ** 2, '\t= ',
a, '^2 + ', f, '^2 \t= ',
b, '^2 + ', e, '^2 \t= ',
c, '^2 + ', d, '^2', sep='')
N -= 1
if N == 0:
return
print_sequence(N)

View file

@ -0,0 +1,42 @@
from WPFObjects import RectangleWPF, ObjectUnderPoint
from WPFObjects import Colors, Window, OnMouseDown
from PABCSystem import Random, Inc, Milliseconds
CountSquares = 10
StatusRect: RectangleWPF
CurrentDigit = 1
Mistakes = 0
def DrawStatusText():
if CurrentDigit <= CountSquares:
StatusRect.Text = ('Удалено квадратов: ' + str(CurrentDigit-1)
+ '\tОшибок: ' + str(Mistakes))
else:
StatusRect.Text = ('Игра окончена. Время: ' + str(Milliseconds() // 1000)
+ ' с.\tОшибок: ' + str(Mistakes))
def MyMouseDown(x: float, y: float, mb: int):
ob = ObjectUnderPoint(x, y)
if ob is RectangleWPF and ob != StatusRect:
if ob.Number == CurrentDigit:
ob.Destroy()
Inc(CurrentDigit)
DrawStatusText()
else:
ob.Color = Colors.Red
Inc(Mistakes)
DrawStatusText()
Window.Title = 'Игра: удали все квадраты по порядку'
for i in range(1, CountSquares + 1):
x = Random(Window.Width - 50)
y = Random(Window.Height - 100)
ob = new RectangleWPF(x, y, 50, 50, Colors.LightGreen, 1)
ob.FontSize = 25
ob.Number = i
StatusRect = new RectangleWPF(0, Window.Height - 40,
Window.Width, 40, Colors.LightBlue)
DrawStatusText()
OnMouseDown = MyMouseDown

View file

@ -0,0 +1,26 @@
import random as rnd
hidden_number = rnd.randint(1, 100)
print('Угадай число от 1 до 100')
attempts = 0
left_border = 1
right_border = 100
while True:
attempts += 1
guess = int(input('Попытка ' + str(attempts) + ':'))
if guess < left_border or right_border < guess:
print('Число', guess, 'не из диапазона',
'[' + str(left_border) + ',', str(right_border) + ']')
continue
if guess < hidden_number:
left_border = guess + 1
print('Загаданное число больше', guess);
elif guess > hidden_number:
right_border = guess - 1
print('Загаданное число меньше', guess);
else:
print('Победа!!!')
break
print('Попробуй число от', left_border,
'до', right_border)
print('Тебе понадобилось', attempts, 'попыток')

View file

@ -0,0 +1,24 @@
a = int(input('Введите первое число:'))
b = int(input('Введите второе число:'))
def print_expressions(a: int, b: int):
print(a, ' +', b, '=', a + b, end = '\n')
print(a, ' -', b, '=', a - b, end = '\n')
print(a, ' *', b, '=', a * b, end = '\n')
print(a, ' %', b, '=', a % b, end = '\n')
print(a, ' /', b, '=', a / b, end = '\n')
print(a, '//', b, '=', a // b, end = '\n')
print(a, '**', b, '=', a ** b, end = '\n')
print_expressions(a, b)
# Введите первое число: 10
# Введите второе число: 6
# 10 + 6 = 16
# 10 - 6 = 4
# 10 * 6 = 60
# 10 % 6 = 4
# 10 / 6 = 1.66666666666667
# 10 // 6 = 1
# 10 ** 6 = 1000000

View file

@ -0,0 +1,9 @@
a = [1, 2, 3]
a.append(4)
a.insert(4, 2)
b = a.copy()
b.reverse()
print(b)
print(a)
print(a.count(2))
print(a.pop(1))

View file

@ -0,0 +1,13 @@
def print_matr(matr: list[list[int]]):
for row in matr:
for elem in row:
print(elem, '\t', end=' ')
print()
matrix_of_integers: list[list[int]]
matrix_of_integers = [
[j * i for j in range(1, 10)]
for i in range(1, 10) if i % 2 == 0
]
print_matr(matrix_of_integers)

View file

@ -0,0 +1,3 @@
n = int(input("Введите двузначние число:"))
print(n // 10, n % 10)

View file

@ -0,0 +1,8 @@
from PABCSystem import Sin,KV,Dict
graph = { 'A': {'C': 3, 'D': 1}}
graph1 = Dict(KV(1,2))
print(Sin(3.1415/2),graph1,graph1)

View file

@ -0,0 +1,3 @@
fruits = ['apple', 'banana', 'cherry']
for i, fruit in enumerate(fruits, 1): # начнём с 1
print(i, fruit)

View file

@ -0,0 +1,20 @@
a = 1
def fun():
global a
# изменение глобальной a
a = 2
def fun2():
# создание локальной a
a = 3
print(a)
fun()
print(a)
fun2()
# a не меняется
print(a)

View file

@ -0,0 +1,13 @@
lst = [3,6,2,5,1,4]
def even(x: int) -> bool:
return x % 2 == 0
def square(x: int) -> int:
return x * x
# Стиль SPython и PascalABC.NET
lst.Where(even).Select(square).Order.Println()
# Стиль Python
print(sorted(map(square,filter(even,lst))))

View file

@ -0,0 +1,17 @@
students = [
{"name": "Alice", "grade": "90"},
{"name": "Bob", "grade": "85"},
{"name": "Charlie", "grade": "92"}
]
print(students)
print(type(students))
def grade_sort(d: dict[str,str]) -> int:
return int(d["grade"])
# отсортировать студентов по убыванию рейтинга
sorted_students = sorted(students, grade_sort, True)
print(sorted_students)

View file

@ -0,0 +1,12 @@
def product(a: list[int], **kwargs: int) -> list[list[int]]:
repeat = kwargs['repeat']
if repeat == 1:
return [[a[i]] for i in range(len(a))]
prev = product(a, repeat = repeat - 1)
res: list[list[int]] = []
for elem in a:
for p in prev:
res.append([elem] + p)
return res
print(product([1,2,3], repeat = 3));

View file

@ -0,0 +1,3 @@
import random
b = [random.randint(0, 99) for i in range(20)]
print(b)

View file

@ -0,0 +1,5 @@
def ip2int( s: str ) -> int:
n = [ int(p) for p in s.split('.') ]
return n[0]*256**3 + n[1]*256**2 + n[2]*256 + n[3]
print(ip2int('127.0.0.1'))

View file

@ -0,0 +1,5 @@
s = '123 456'
res = map(int,s.split)
print(res)

View file

@ -0,0 +1,7 @@
def f() -> tuple[int,int]:
return (1,1)
print((1,2) != (2,3))
s = 'ds1h'
print('1' in s)

View file

@ -0,0 +1,15 @@
def F( n : int) -> int:
return 1 if n == 20 else \
0 if n > 20 else \
F(n+1) + F(2*n)
graph = { 'A': {'C': 3, 'D': 1},
'B': {'C': 4, 'D': 5, 'E': 1},
'C': {'A': 3, 'B': 4, 'E': 2},
'D': {'A': 1, 'B': 5, 'E': 1},
'E': {'B': 1, 'C': 2, 'D': 1} }
print(graph,type(graph),sep = "\n")
#d = float(1)
#e = int('e')

View file

@ -0,0 +1,2 @@
for x in range(10):
print(x,end = ' ')

View file

@ -0,0 +1,11 @@
season = int(input())
if season == 1:
print("весна")
elif season == 2:
print("лето")
elif season == 3:
print("осень")
elif season == 4:
print("зима")

View file

@ -0,0 +1,3 @@
a = [x for x in range(10) if x % 2 == 0]
print(a)

View file

@ -0,0 +1,6 @@
d = {'1': [1, 2]}
if '1' in d:
print(true)

View file

@ -0,0 +1,5 @@
#unit random
import PABCSystem
def randint(a: int, b: int) -> int:
return PABCSystem.random(a, b)

View file

@ -0,0 +1,8 @@
#unit random
import PABCSystem
def random() -> float:
return PABCSystem.random()
def randint(a: int, b: int) -> int:
return PABCSystem.random(a, b)

View file

@ -0,0 +1,11 @@
from time import time
s: set[int] = set()
t1 = time()
for i in range(1, 1000000):
s |= {i}
t2 = time()
print(t2 - t1)
print(len(s))

View file

@ -0,0 +1,18 @@
begin
var n := 60000;
var t1 := Milliseconds;
var sm := 0.0;
var i := 1.0;
while i < n do
begin
var j := 1.0;
while j < n do
begin
sm += 1.0 / i / j;
j += 1;
end;
i += 1;
end;
var t2 := Milliseconds;
print(t2 - t1);
end.

View file

@ -0,0 +1,16 @@
import time
n = 60000
start = time.time()
sm: float = 0
i = 1.0
while i < n:
j = 1.0
while j < n:
sm += 1.0 / i / j
j += 1
i += 1
end = time.time();
print(end - start)

View file

@ -0,0 +1,18 @@
# Рекурсивная функция вычисления факториала
def factorial(n: int)-> bigint:
if n == 0:
return 1
return n * factorial(n - 1)
# Не рекурсивная функция вычисления числа Фибоначчи
def fibonacci(n: int)-> bigint:
if n <= 1:
return n
f1: bigint = 0
f2: bigint = 1
for i in range(n - 1):
t = f1 + f2
f1 = f2
f2 = t
return f2

View file

@ -0,0 +1,15 @@
Uses unit_example;
const N: integer = 10;
begin
println('Последовательность чисел Фибоначчи:');
for var i := 1 to N do
println('F(' + i + ')=', fibonacci(i));
println();
println('Последовательность факториалов:');
for var i := 1 to N do
println(i + '!=', factorial(i));
println();
end.

View file

@ -0,0 +1,19 @@
from unit_example import fibonacci as F, factorial as fact
N = 10
fibs = [F(i) for i in range(1, N + 1)]
print("Последовательность чисел Фибоначчи:")
i = 0
for fib_num in fibs:
i += 1
print('F(' + str(i) + ')\t=', fib_num)
print()
facts = [fact(i) for i in range(1, N + 1)]
print("Последовательность факториалов:")
i = 0
for fact_num in facts:
i += 1
print(str(i) + '!\t=', fact_num)
print()

View file

@ -1 +1 @@
3.11.0.3654
3.11.0.3661

View file

@ -80,6 +80,10 @@ SectionEnd
LangString DESC_Minimal ${LANG_ENGLISH} "Minimal"
LangString DESC_PascalABCNET_Language ${LANG_RUSSIAN} "Язык PascalABC.NET"
LangString DESC_PascalABCNET_Language ${LANG_ENGLISH} "PascalABC.NET language"
LangString DESC_SPython_Language ${LANG_RUSSIAN} "Язык SPython"
LangString DESC_SPython_Language ${LANG_ENGLISH} "SPython language"
LangString DESC_Compiler ${LANG_RUSSIAN} "Компилятор"
LangString DESC_Compiler ${LANG_ENGLISH} "Compiler"
LangString DESC_Envr ${LANG_RUSSIAN} "Оболочка"

View file

@ -2,6 +2,7 @@
SectionGroup $(DESC_InputLanguages) Languages
!include sect_PascalABCParser.nsh
!include sect_SPythonParser.nsh
SectionGroupEnd
SectionGroup $(DESC_Envr) Envr

View file

@ -1 +1 @@
!define VERSION '3.11.0.3654'
!define VERSION '3.11.0.3661'

View file

@ -0,0 +1,11 @@
uses
// SPython
//SPythonSystem, SPythonHidden,
time1,
SPythonSystemPys, itertools, math
;
begin
writeln(cos(pi));
readln;
end.

View file

@ -179,6 +179,13 @@
File ..\bin\Lib\Tasks1Arr.pcu
File ..\bin\Lib\WPF.pcu
File ..\bin\Lib\SPythonHidden.pcu
File ..\bin\Lib\SPythonSystem.pcu
File ..\bin\Lib\time1.pcu
File ..\bin\Lib\SPythonSystemPys.pcu
File ..\bin\Lib\itertools.pcu
File ..\bin\Lib\math.pcu
File ..\bin\Lib\PABCRtl.dll
File ..\bin\Lib\HelixToolkit.Wpf.dll
File ..\bin\Lib\HelixToolkit.dll
@ -271,6 +278,13 @@
${AddFile} "Tasks1Arr.pcu"
${AddFile} "WPF.pcu"
;SPython
${AddFile} "SPythonHidden.pcu"
${AddFile} "SPythonSystem.pcu"
${AddFile} "time1.pcu"
${AddFile} "SPythonSystemPys.pcu"
${AddFile} "itertools.pcu"
${AddFile} "math.pcu"
${AddFile} "turtle.png"
@ -379,6 +393,15 @@
File ..\bin\Lib\Мозаика.pas
File ..\bin\Lib\WPF.pas
;SPython
File ..\bin\Lib\SPythonHidden.pas
File ..\bin\Lib\SPythonSystem.pas
File ..\bin\Lib\time1.pas
File ..\bin\Lib\SPythonSystemPys.pys
File ..\bin\Lib\itertools.pys
File ..\bin\Lib\math.pys
File ..\bin\Lib\__RedirectIOMode.vb
File ..\bin\Lib\VBSystem.vb
@ -458,6 +481,15 @@
${AddFile} "Мозаика.pas"
${AddFile} "WPF.pas"
;SPython
${AddFile} "SPythonHidden.pas"
${AddFile} "SPythonSystem.pas"
${AddFile} "time1.pas"
${AddFile} "SPythonSystemPys.pys"
${AddFile} "itertools.pys"
${AddFile} "math.pys"
${AddFile} "__RedirectIOMode.vb"
${AddFile} "VBSystem.vb"

View file

@ -0,0 +1,48 @@
Section $(DESC_SPython_Language) SPythonSection
SectionIn 1 2
; Установка файлов SPython
SetOutPath "$INSTDIR"
File "..\bin\SPythonParser.dll"
File "..\bin\SPythonLanguageInfo.dll"
File "..\bin\SPythonStandardTreeConverter.dll"
File "..\bin\SPythonSyntaxTreeVisitor.dll"
${AddFile} "SPythonParser.dll"
${AddFile} "SPythonLanguageInfo.dll"
${AddFile} "SPythonStandardTreeConverter.dll"
${AddFile} "SPythonSyntaxTreeVisitor.dll"
; Файл подсветки синтаксиса
SetOutPath "$INSTDIR\Highlighting"
File "..\bin\Highlighting\SPython.xshd"
${AddFile} "SPython.xshd"
; Оптимизация .NET библиотек через NGEN
SetOutPath "$INSTDIR"
Push "SPythonParser.dll"
Call NGEN
Push "SPythonLanguageInfo.dll"
Call NGEN
Push "SPythonStandardTreeConverter.dll"
Call NGEN
Push "SPythonSyntaxTreeVisitor.dll"
Call NGEN
DeleteRegKey HKCR "pys"
;insalling pys file type
ReadRegStr $R0 HKCR ".pys" ""
StrCmp $R0 "PascalABCNET.SPythonParser" 0 +2
DeleteRegKey HKCR "PascalABCNET.SPythonParser"
WriteRegStr HKCR ".pys" "" "PascalABCNET.SPythonParser"
WriteRegStr HKCR "PascalABCNET.SPythonParser" "" "SPython Program"
WriteRegStr HKCR "PascalABCNET.SPythonParser\DefaultIcon" "" "$INSTDIR\Ico\pas.ico"
ReadRegStr $R0 HKCR "PascalABCNET.SPythonParser\shell\open\command" ""
StrCmp $R0 "" 0 no_nshopen
WriteRegStr HKCR "PascalABCNET.SPythonParser\shell" "" "open"
WriteRegStr HKCR "PascalABCNET.SPythonParser\shell\open\command" "" '"$INSTDIR\PascalABCNET.exe" "%1"'
no_nshopen:
WriteRegStr HKCR "PascalABCNET.SPythonParser\shell\compile" "" "Компилировать"
WriteRegStr HKCR "PascalABCNET.SPythonParser\shell\compile\command" "" '"$INSTDIR\pabcnetc.exe" "%1"'
SectionEnd

View file

@ -18,6 +18,7 @@ dotnet build -c Release --no-incremental PascalABCNET.sln
cd ReleaseGenerators
..\bin\pabcnetc RebuildStandartModules.pas /rebuild
..\bin\pabcnetc RebuildStandartModulesSPython.pas
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR
cd PABCRtl
@ -33,6 +34,7 @@ ExecHide.exe gacutil.exe /u PABCRtl
ExecHide.exe gacutil.exe /i ..\bin\Lib\PABCRtl.dll
..\bin\pabcnetc RebuildStandartModules.pas /rebuild
..\bin\pabcnetc RebuildStandartModulesSPython.pas
@IF %ERRORLEVEL% NEQ 0 GOTO ERROR

15
bin/Lib/time1.pas Normal file
View file

@ -0,0 +1,15 @@
unit time1;
interface
function time(): real;
function forty_two(): real;
implementation
function time() : real := DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
function forty_two() : real := 42;
end.