Skip to content

Instantly share code, notes, and snippets.

@rozeappletree
Created November 21, 2019 13:14
Show Gist options
  • Save rozeappletree/8057c3e4a6a556e7f16fae05e4bac66f to your computer and use it in GitHub Desktop.
Save rozeappletree/8057c3e4a6a556e7f16fae05e4bac66f to your computer and use it in GitHub Desktop.
io19-demo-2-interoperability.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "io19-demo-2-interoperability.ipynb",
"provenance": [],
"collapsed_sections": [],
"include_colab_link": true
},
"kernelspec": {
"name": "swift",
"display_name": "Swift"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/rakesh4real/8057c3e4a6a556e7f16fae05e4bac66f/io19-demo-2-interoperability.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "xSYmKIt59Zt3",
"colab_type": "text"
},
"source": [
"**Credits:** Google I/O 19 "
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "3WKd4UjLASm0",
"colab_type": "text"
},
"source": [
"#Interoperability\n",
"\n",
"## 1. Import from Python"
]
},
{
"cell_type": "code",
"metadata": {
"id": "4dsTWOz7ADgB",
"colab_type": "code",
"outputId": "4fe6b1a1-c44b-426e-df80-c83ae03c25c6",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
}
},
"source": [
"import Python\n",
"Python.version"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"3.6.8 (default, Oct 7 2019, 12:59:55) \n",
"[GCC 8.3.0]\n"
]
},
"metadata": {
"tags": []
},
"execution_count": 1
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "AHxl-3uQAZ0l",
"colab_type": "code",
"outputId": "8031fd08-a78c-4225-b14b-5c4b000d2e73",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"let np = Python.import(\"numpy\")\n",
"let plt = Python.import(\"matplotlib.pyplot\")\n",
"\n",
"// Also enable Jupyter's display capabilities\n",
"%include \"EnableIPythonDisplay.swift\"\n",
"IPythonDisplay.shell.enable_matplotlib(\"inline\")"
],
"execution_count": 0,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"('inline', 'module://ipykernel.pylab.backend_inline')\n"
]
},
"metadata": {
"tags": []
},
"execution_count": 2
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "YCSlByHIAfLT",
"colab_type": "code",
"outputId": "d21902c3-2e4f-468d-ead6-8006cb98e3d8",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 282
}
},
"source": [
"let x = np.linspace(0, 10, 100)\n",
"\n",
"plt.plot(x, np.sin(x))\n",
"plt.plot(x, np.cos(x))\n",
"\n",
"plt.show()"
],
"execution_count": 0,
"outputs": [
{
"output_type": "display_data",
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "execute_result",
"data": {
"text/plain": [
"None\n"
]
},
"metadata": {
"tags": []
},
"execution_count": 3
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "pmn3t-zkA2l0",
"colab_type": "text"
},
"source": [
"## 2. C Interoperability"
]
},
{
"cell_type": "code",
"metadata": {
"id": "LmKS4AnJAjeh",
"colab_type": "code",
"colab": {}
},
"source": [
"import Glibc"
],
"execution_count": 0,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "_PmkdeghA7cb",
"colab_type": "code",
"outputId": "ccd03e24-197d-4d0c-971f-8545afdbeef3",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 34
}
},
"source": [
"let address = malloc(32)!\n",
"let string = address.bindMemory(to: CChar.self, capacity: 32)\n",
"\n",
"strcpy(string, \"This looks more friendly than C itself!\")\n",
"puts(string)\n",
"\n",
"free(address)"
],
"execution_count": 0,
"outputs": [
{
"output_type": "stream",
"text": [
"This looks more friendly than C itself!\r\n"
],
"name": "stdout"
}
]
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment