Here’s a simple definition of a struct:Синтаксически самое большое отличие от класса Python заключается в том, что все свойства экземпляра в структуре должны быть явно объявлены с помощью объявления var или let.Код: Выделить всё
struct MyPair: var first: Int var second: Int # We use 'fn' instead of 'def' here - we'll explain that soon fn __init__(inout self, first: Int, second: Int): self.first = first self.second = second fn __lt__(self, rhs: MyPair) -> Bool: return self.first < rhs.first or (self.first == rhs.first and self.second < rhs.second)
язык программирования Mojo
Модератор: Olej
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
язык программирования Mojo
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
язык программирования Mojo
Передача управление аргументом, и владение памятью
И в Python, и в Mojo большая часть языка вращается вокруг вызовов функций: многие (очевидно) встроенные варианты поведения реализованы в стандартной библиотеке с помощью методов «dunder» (двойное подчеркивание). Внутри этих магических функций большая часть владения памятью определяется посредством передачи аргументов.
Давайте рассмотрим некоторые подробности о том, как Python и Mojo передают аргументы:
- Все значения, передаваемые в функцию def Python, используют ссылочную семантику. Это означает, что функция может изменять переданные в нее изменяемые объекты, и эти изменения видны за пределами функции. Однако такое поведение иногда может удивить непосвященных, поскольку вы можете изменить объект, на который указывает аргумент, и это изменение не будет видно за пределами функции.
- Все значения, передаваемые в функцию определения Mojo, по умолчанию используют семантику значений. По сравнению с Python это важное отличие: функция def Mojo получает копию всех аргументов — она может изменять аргументы внутри функции, но изменения не видны вне функции.
- Все значения, передаваемые в функцию Mojo fn, по умолчанию являются неизменяемыми ссылками. Это означает, что функция может читать исходный объект (это не копия), но вообще не может его модифицировать.
Это соглашение о передаче неизменяемых аргументов в функции Mojo называется «заимствованием». В следующих разделах мы объясним, как можно изменить поведение передачи аргументов в Mojo как для функций def, так и для fn.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
язык программирования Mojo
Почему соглашения аргументации важны
В Python все фундаментальные значения являются ссылками на объекты — как описано выше, функция Python может изменять исходный объект. Таким образом, разработчики Python привыкли воспринимать все как справочную семантику. Однако на уровне CPython или компьютера вы можете видеть, что сами ссылки на самом деле передаются путем копирования — Python копирует указатель и корректирует счетчик ссылок.
Этот подход Python обеспечивает удобную модель программирования для большинства людей, но он требует, чтобы все значения распределялись в куче (и результаты иногда оказываются неожиданными из-за совместного использования ссылок). Классы Mojo (TODO: will) следуют одному и тому же ссылочно-семантическому подходу для большинства объектов, но это непрактично для простых типов, таких как целые числа, в контексте системного программирования. В этих сценариях мы хотим, чтобы значения находились в стеке или даже в аппаратных регистрах. Таким образом, структуры Mojo всегда встраиваются в свой контейнер, будь то поле другого типа или фрейм стека содержащей функции.
Это поднимает несколько интересных вопросов: как реализовать методы, которым необходимо изменять self типа структуры, например __iadd__? Как работает let и как он предотвращает мутации? Как контролируется время жизни этих значений, чтобы Mojo оставался безопасным для памяти языком?
Ответ заключается в том, что компилятор Mojo использует анализ потока данных и аннотации типов, чтобы обеспечить полный контроль над копиями значений, псевдонимами ссылок и контролем мутаций. Эти функции во многом похожи на функции языка Rust, но они работают несколько по-другому, чтобы облегчить изучение Mojo, и они лучше интегрируются в экосистему Python, не требуя огромного количества аннотаций.
В следующих разделах вы узнаете, как можно контролировать владение памятью для объектов, передаваемых в функции Mojo fn.
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
язык программирования Mojo
За неимением времени, другим был занят, не смотрел что там с Mojo.
Сейчас решил вернуться посмотреть что там....
Давненько я не видел чтоб так вдребезги что-то разлеталось
Вот он ... как установлен месяцев 3-4 назад:
Сейчас решил вернуться посмотреть что там....
И вот :Olej писал(а): ↑11 сен 2023, 18:09Код: Выделить всё
olej@R420:~$ modular update mojo # No updates available for this target.
Код: Выделить всё
olej@R420:~$ modular update mojo
loc("#M.target<triple = \22x86_64-unknown-linux\22, cpu = \22ivybridge\22, features = \22+64bit,+aes,+avx,+cmov,+crc32,+cx16,+cx8,+f16c,+fsgsbase,+fxsr,+mmx,+pclmul,+popcnt,+rdrnd,+sahf,+sse,+sse2,+sse3,+sse4.1,+sse4.2,+ssse3,+x87,+xsave,+xsaveopt\22, data_layout = \22e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128\22, simd_bit_width = 128>":1:50): error: duplicate or unknown struct parameter name: cpu
Please submit a bug report to https://github.com/modularml/mojo/issues and include the crash backtrace along with all the relevant source codes.
Stack dump:
0. Program arguments: modular update mojo
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0 modular 0x000056053154d867
1 modular 0x000056053154b51e
2 modular 0x000056053154df2f
3 libc.so.6 0x00007f8b36703520
4 modular 0x0000560531973ba4
5 modular 0x000056053197322f
6 modular 0x0000560531529354
7 modular 0x000056053152873a
8 modular 0x000056053150f4b3
9 libc.so.6 0x00007f8b366ead90
10 libc.so.6 0x00007f8b366eae40 __libc_start_main + 128
11 modular 0x000056053150e6be
Ошибка сегментирования (образ памяти сброшен на диск)
Вот он ... как установлен месяцев 3-4 назад:
Код: Выделить всё
olej@R420:~/2023/MY.LAN$ aptitude show modular
Пакет: modular
Версия: 0.3.1
Новый: да
Состояние: установлен
Установлен автоматически: нет
Приоритет: необязательный
Раздел: contrib/devel
Сопровождающий: The Modular Develoeprs <hello@modular.com>
Архитектура: amd64
Размер в распакованном виде: 0
Зависит: python3, python3-pip, libtinfo-dev, libxml2, libxml2-dev
Описание: Modular installation tool
Домашняя страница: https://modular.com
Код: Выделить всё
olej@R420:~/2023/own.WORK/Mojo$ modular --version
modular 0.3.1 (589ce200)
Код: Выделить всё
olej@R420:~/2023/own.WORK/Mojo$ mojo --version
mojo 0.2.1 (64d14e85)
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
язык программирования Mojo
Переустановить?
Код: Выделить всё
olej@R420:~/2023/own.WORK/Mojo$ sudo apt-get update && sudo apt-get install modular
[sudo] пароль для olej:
Сущ:1 http://neilalexander.s3.dualstack.eu-west-2.amazonaws.com/deb debian InRelease
Сущ:2 http://dl.google.com/linux/chrome/deb stable InRelease
Сущ:3 http://ubuntu.volia.net/ubuntu-archive jammy InRelease
Сущ:4 http://ubuntu.volia.net/ubuntu-archive jammy-updates InRelease
Сущ:5 http://ubuntu.volia.net/ubuntu-archive jammy-backports InRelease
Сущ:6 https://updates.signal.org/desktop/apt xenial InRelease
Игн:7 https://mirror.host4biz.eu/linuxmint/pkg victoria InRelease
Сущ:8 https://dl.yarnpkg.com/debian stable InRelease
Сущ:9 https://mirror.host4biz.eu/linuxmint/pkg victoria Release
Сущ:10 https://brave-browser-apt-release.s3.brave.com stable InRelease
Сущ:11 https://repo.skype.com/deb stable InRelease
Пол:12 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
Сущ:13 https://linux.teamviewer.com/deb stable InRelease
Сущ:14 https://packages.microsoft.com/repos/ms-teams stable InRelease
Сущ:15 https://deb.opera.com/opera-stable stable InRelease
Пол:16 https://dl.modular.com/public/installer/deb/linuxmint vanessa InRelease [5.080 B]
Получено 115 kB за 3с (43,5 kB/s)
Чтение списков пакетов… Готово
W: https://dl.yarnpkg.com/debian/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
W: https://repo.skype.com/deb/dists/stable/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.
Чтение списков пакетов… Готово
Построение дерева зависимостей… Готово
Чтение информации о состоянии… Готово
Уже установлен пакет modular самой новой версии (0.3.1).
Обновлено 0 пакетов, установлено 0 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Код: Выделить всё
olej@R420:~/2023/own.WORK/Mojo$ modular clean
Код: Выделить всё
olej@R420:~/2023/own.WORK/Mojo$ modular install mojo
# Found release for https://packages.modular.com/mojo @ 0.6.1
# Installing to /home/olej/.modular/pkg/packages.modular.com_mojo
# Downloading artifacts. Please wait...
# Downloads complete, setting configs...
# Configs complete, running post-install hooks...
Collecting find_libpython==0.3.0
Using cached find_libpython-0.3.0-py3-none-any.whl (8.5 kB)
Collecting jupyter_client>=8.3.0
Downloading jupyter_client-8.6.0-py3-none-any.whl (105 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 105.9/105.9 KB 1.0 MB/s eta 0:00:00
Collecting ipykernel>=6.25.0
Downloading ipykernel-6.27.1-py3-none-any.whl (114 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 114.6/114.6 KB 2.2 MB/s eta 0:00:00
Collecting python-dateutil>=2.8.2
Using cached python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
Collecting traitlets>=5.3
Downloading traitlets-5.14.0-py3-none-any.whl (85 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 85.2/85.2 KB 1.6 MB/s eta 0:00:00
Collecting pyzmq>=23.0
Downloading pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl (1.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.1/1.1 MB 2.2 MB/s eta 0:00:00
Collecting tornado>=6.2
Downloading tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (435 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 435.4/435.4 KB 2.2 MB/s eta 0:00:00
Collecting jupyter-core!=5.0.*,>=4.12
Downloading jupyter_core-5.5.1-py3-none-any.whl (28 kB)
Collecting matplotlib-inline>=0.1
Downloading matplotlib_inline-0.1.6-py3-none-any.whl (9.4 kB)
Collecting nest-asyncio
Downloading nest_asyncio-1.5.8-py3-none-any.whl (5.3 kB)
Collecting comm>=0.1.1
Downloading comm-0.2.0-py3-none-any.whl (7.0 kB)
Collecting psutil
Downloading psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl (285 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 285.5/285.5 KB 2.2 MB/s eta 0:00:00
Collecting ipython>=7.23.1
Downloading ipython-8.18.1-py3-none-any.whl (808 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 808.2/808.2 KB 2.4 MB/s eta 0:00:00
Collecting debugpy>=1.6.5
Downloading debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (3.3 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.3/3.3 MB 2.4 MB/s eta 0:00:00
Collecting packaging
Downloading packaging-23.2-py3-none-any.whl (53 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 53.0/53.0 KB 1.9 MB/s eta 0:00:00
Collecting jedi>=0.16
Downloading jedi-0.19.1-py2.py3-none-any.whl (1.6 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.6/1.6 MB 2.4 MB/s eta 0:00:00
Collecting decorator
Downloading decorator-5.1.1-py3-none-any.whl (9.1 kB)
Collecting prompt-toolkit<3.1.0,>=3.0.41
Downloading prompt_toolkit-3.0.43-py3-none-any.whl (386 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 386.1/386.1 KB 2.1 MB/s eta 0:00:00
Collecting pexpect>4.3
Downloading pexpect-4.9.0-py2.py3-none-any.whl (63 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 63.8/63.8 KB 1.9 MB/s eta 0:00:00
Collecting pygments>=2.4.0
Downloading pygments-2.17.2-py3-none-any.whl (1.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 2.4 MB/s eta 0:00:00
Collecting stack-data
Downloading stack_data-0.6.3-py3-none-any.whl (24 kB)
Collecting exceptiongroup
Downloading exceptiongroup-1.2.0-py3-none-any.whl (16 kB)
Collecting platformdirs>=2.5
Downloading platformdirs-4.1.0-py3-none-any.whl (17 kB)
Collecting six>=1.5
Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Collecting parso<0.9.0,>=0.8.3
Downloading parso-0.8.3-py2.py3-none-any.whl (100 kB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100.8/100.8 KB 1.7 MB/s eta 0:00:00
Collecting ptyprocess>=0.5
Downloading ptyprocess-0.7.0-py2.py3-none-any.whl (13 kB)
Collecting wcwidth
Downloading wcwidth-0.2.12-py2.py3-none-any.whl (34 kB)
Collecting executing>=1.2.0
Downloading executing-2.0.1-py2.py3-none-any.whl (24 kB)
Collecting asttokens>=2.1.0
Downloading asttokens-2.4.1-py2.py3-none-any.whl (27 kB)
Collecting pure-eval
Downloading pure_eval-0.2.2-py3-none-any.whl (11 kB)
Installing collected packages: wcwidth, pure-eval, ptyprocess, find_libpython, traitlets, tornado, six, pyzmq, pygments, psutil, prompt-toolkit, platformdirs, pexpect, parso, packaging, nest-asyncio, executing, exceptiongroup, decorator, debugpy, python-dateutil, matplotlib-inline, jupyter-core, jedi, comm, asttokens, stack-data, jupyter_client, ipython, ipykernel
Successfully installed asttokens-2.4.1 comm-0.2.0 debugpy-1.8.0 decorator-5.1.1 exceptiongroup-1.2.0 executing-2.0.1 find_libpython-0.3.0 ipykernel-6.27.1 ipython-8.18.1 jedi-0.19.1 jupyter-core-5.5.1 jupyter_client-8.6.0 matplotlib-inline-0.1.6 nest-asyncio-1.5.8 packaging-23.2 parso-0.8.3 pexpect-4.9.0 platformdirs-4.1.0 prompt-toolkit-3.0.43 psutil-5.9.7 ptyprocess-0.7.0 pure-eval-0.2.2 pygments-2.17.2 python-dateutil-2.8.2 pyzmq-25.1.2 six-1.16.0 stack-data-0.6.3 tornado-6.4 traitlets-5.14.0 wcwidth-0.2.12
🔥 Mojo installed! 🔥
Mojo's Python virtual environment created at /home/olej/.modular/pkg/packages.modular.com_mojo/venv
If you are using ZSH (default on macOS), run the following commands:
echo 'export MODULAR_HOME="/home/olej/.modular"' >> ~/.zshrc
echo 'export PATH="/home/olej/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> ~/.zshrc
source ~/.zshrc
If you are using bash, run the following commands:
BASHRC=$( [ -f "$HOME/.bash_profile" ] && echo "$HOME/.bash_profile" || echo "$HOME/.bashrc" )
echo 'export MODULAR_HOME="/home/olej/.modular"' >> "$BASHRC"
echo 'export PATH="/home/olej/.modular/pkg/packages.modular.com_mojo/bin:$PATH"' >> "$BASHRC"
source "$BASHRC"
Then enter 'mojo' to start the Mojo REPL.
For tool help, enter 'mojo --help'.
For more docs, see https://docs.modular.com/mojo.
Код: Выделить всё
olej@R420:~/2023/own.WORK/Mojo$ mojo --version
mojo 0.6.1 (876ded2e)
0.2.1 => 0.6.1 - За 3 месяцаOlej писал(а): ↑21 дек 2023, 17:24Код: Выделить всё
olej@R420:~/2023/own.WORK/Mojo$ mojo --version mojo 0.2.1 (64d14e85)
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
язык программирования Mojo
Хотелось бы понимать - это пишут о том, что понимают Тогда вопрос: "как?". У меня не получатся использовать Python код...
Диалоговая консоль как-то непонятно дуркует ... "то ли да, то ли нет":
Код: Выделить всё
olej@R420:~/2023/own.WORK/Mojo$ mojo
Welcome to Mojo! 🔥
Expressions are delimited by a blank line.
Type `:quit` to exit the REPL and `:mojo help` for further assistance.
1> import numpy
2.
[User] error: Expression [0]:1:8: unable to locate module 'numpy'
import numpy
^
expression failed to parse (no further compiler diagnostics)
1> import pandas
2. import matplotlib
3. :quit
4. ^C
1> import numpy
2. ^C
1> :quit
Process 61410 exited with status = 9 (0x00000009) killed
- Olej
- Писатель
- Сообщения: 21338
- Зарегистрирован: 24 сен 2011, 14:22
- Откуда: Харьков
- Контактная информация:
язык программирования Mojo
Беру из загашников, реализация чисел Фибоначчи, лет 10 назад:
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo$ cat fibo.py
#!/usr/bin/python3
import sys
def fib( n ) :
if n < 2 : return 1
else: return fib( n - 1 ) + fib( n - 2 )
print( "{}".format( fib( int( sys.argv[ 1 ] ) ) ) )
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo$ python fibo.py 12
233
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo$ cp fibo.py fibo.mojo
Код: Выделить всё
olej@R420:~/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo$ mojo build fibo.mojo
/home/olej/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo/fibo.mojo:10:1: error: TODO: expressions are not yet supported at the file scope level
print( "{}".format( fib( int( sys.argv[ 1 ] ) ) ) )
^
/home/olej/2023/own.BOOKs/NET.2/Nexamples.WORK/Mojo/fibo.mojo:10:12: error: 'StringLiteral' value has no attribute 'format'
print( "{}".format( fib( int( sys.argv[ 1 ] ) ) ) )
~~~~^~~~~~~
mojo: error: failed to parse the provided Mojo
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей